特定のコントロール (コンボボックス) をフックし、そのコントロールに入力されたすべてのキーを受け取りたいです。Combobox は 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++ で検証) が、キーがキャプチャされていません。SetWindowsHookEx 関数の最後のパラメーターとして「0」を使用しても問題なく動作しますが、もちろんグローバル フックになります。