The low-level keyboard/mouse hooks provided by SetWindowsHookEx()
report if input was generated by actual devices or injected by application code.
For a low-level keyboard hook, the hook provides a pointer to a KBDLLHOOKSTRUCT
structure, which has a flags
member that contains a LLKHF_INJECTED
flag for fake input.
For a low-level mouse hook, the hook provides a pointer to a MSLLHOOKSTRUCT
structure, which has a flags
member that contains either a LLMHF_INJECTED
or LLMHF_LOWER_IL_INJECTED
flag for fake input.
Either hook can return a non-zero value to block the input from being passed to the rest of the hook chain, and consequently to the target window.
Regarding the Raw Input API, according to (an older version of 1) the documentation for the GetRawInputDeviceInfo()
function:
hDevice [in, optional]
Type: HANDLE
A handle to the raw input device. This comes from the lParam of the WM_INPUT message, from the hDevice member of RAWINPUTHEADER, or from GetRawInputDeviceList. It can also be NULL if an application inserts input data, for example, by using SendInput.
1: the highlighted note has been removed in the current version of the documentation, I do not know why.
So, the hDevice
that is reported by a WM_INPUT
message will be NULL for fake input.
however, it is not possible to block input with the Raw Input API. You still need a low-level hook for that.
SetWindowsHookEx()
do report if input is real or simulated. AFAIK, the Raw Input API does not. – PrincelingGetRawInputDeviceInfo
had a note for 'hDevice': "Handle to the raw input device. [...] It can also be NULL if an application inserts input data, for example, by using SendInput. ". Can find it in for instance XE2's api docs. This note is removed from the documentation now, I don't know why, butGetRawInputDeviceInfo
should normally be able to tell the difference. – Symon