Я хочу подключить определенный элемент управления (поле со списком) и получить все клавиши, введенные в этом элементе управления. Поле со списком является частью ленты 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, но тогда, конечно, это глобальный хук.