の唯一のコンストラクターを調べたところ、globalKeyboardHook
グローバルフック専用に設計されているようです。次のようにのみ、現在実行中のモジュールにフックする別のオーバーロードを追加できます。
class globalKeyboardHook {
[DllImport("kernel32")]
private static extern int GetCurrentThreadId();
[DllImport("user32")]
private static extern IntPtr SetWindowsHookEx(int hookType, KeyBoardProc proc, IntPtr moduleHandle, int threadId);
[DllImport("user32")]
private static extern int CallNextHookEx(IntPtr hHook, int nCode, IntPtr wParam, IntPtr lParam);
public globalKeyboardHook(bool currentModuleOnly){
if(currentModuleOnly){
proc = KeyBoardCallback;
//WH_KEYBOARD = 0x2
hhook = SetWindowsHookEx(2, proc, IntPtr.Zero, GetCurrentThreadId());
} else hook();
}
public delegate int KeyBoardProc(int nCode, IntPtr wParam, IntPtr lParam);
public int KeyBoardCallback(int nCode, IntPtr wParam, IntPtr lParam) {
if (nCode >= 0) {
Keys key = (Keys)wParam;
var lp = lParam.ToInt64();
//your own handling with the key
if ((lp >> 31) == 0)//Key down
{
//your own code ...
} else { //Key up
//your own code ...
}
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
KeyBoardProc proc;
//other code ...
}
//then use the new overload constructor instead of the parameterless constructor:
globalHook = new globalKeyboardHook(true);
注:上記の投稿(コメント)に基づいて、独自のイベントをKeyDown
実装できます。いくつかの検索の後、 はグローバル フックのみをサポートし、は専用であることがわかりました。の代わりにそれが必要です。KeyUp
your own code ...
WH_KEYBOARD_LL
WH_KEYBOARD
thread hook
WH_KEYBOARD_LL
ところで、IMessageFilter
この場合、アプリケーションで登録/追加できる を使用できるとは思えません。PreFilterMessage
でのキーおよびマウス メッセージをインターセプトするのに役立つ方法もサポートしていapplication-level
ます。それを検索してみてください。簡単にフォローできます。