我想挂钩特定控件(组合框)并接收在该控件中键入的所有键。组合框是 Outlook 功能区的一部分,没有按键或其他事件(只是 onChange 行为非常奇怪)。
这是代码:
private const int WH_KEYBOARD_LL = 13;
private const int WM_KEYDOWN = 0x0100;
private LowLevelKeyboardProc _proc;
private IntPtr _hookID = IntPtr.Zero;
private void SetHook(IntPtr handle)
{
uint PID; //not needed
_proc = HookCallback;
uint threadid = GetWindowThreadProcessId(handle, out PID);
_hookID = SetWindowsHookEx(WH_KEYBOARD_LL, _proc, IntPtr.Zero, threadid );
}
private delegate IntPtr LowLevelKeyboardProc(
int nCode, IntPtr wParam, IntPtr lParam);
private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
int vkCode = Marshal.ReadInt32(lParam);
System.Diagnostics.Debug.WriteLine("Key: " + (Keys)vkCode);
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
我拥有的句柄和我得到的 ThreadID 是正确的(通过 Spy++ 验证)但没有捕获任何密钥。使用“0”作为 SetWindowsHookEx 函数的最后一个参数可以正常工作,但它当然是一个全局挂钩。