現在、特定のキーボード (HID を使用してフィルター処理) からのキーストロークをインターセプトするプログラムを作成しています。そのため、特定のデバイスから送信されたキーストロークを知るために、この素晴らしいチュートリアルに触発された RawInput テクニックを使用しました。
http://www.codeproject.com/Articles/17123/Using-Raw-Input-from-C-to-handle-multiple-keyboard
キーストロークを取得し、どのキーボードがそれを生成したかを知ることができます。
私のプロジェクトの難しい部分は、この特定のキーボードからのキーストロークをインターセプトしてブロックし、これらのキーストロークがフォーカスされたアプリケーションに到達しないようにすることです (フォーカスされているとは、OS によってもたらされるフォアグラウンド ウィンドウを意味します)。
したがって、自然な解決策は、ウィンドウ ハンドルを持つ現在のすべてのスレッドで、低レベルのグローバル フックを使用することでした。
それを行うために、このページのコードを使用して適応させました。
http://blogs.msdn.com/b/toub/archive/2006/05/03/589423.aspx
作業が混乱しないように、Visual Studio で新しいプロジェクトを作成しました。いくつかの調査の後、コールバック関数で値 (-1) を返すことにより、すべてのアプリケーションでキーストロークをブロックすることができました。
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
//Check if we have a key to pass
if (
nCode >= 0 && (
(wParam == (IntPtr)WM_KEYDOWN) || (wParam == (IntPtr)WM_KEYUP) )
)
{
int vkCode = Marshal.ReadInt32(lParam);
if ((Keys)vkCode == Form1.KeysToIgnore)
{
return (IntPtr)(-1);
}
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
すべて (フック プロシージャとキーストローク検出) をまとめるために、最終的なプロジェクトで 2 つのスレッドを作成します。
1つ目: RawInput を使用して各キーストロークを識別し、デバイスにアタッチする
2番目:すべてのウィンドウをフックし、特定のキーストロークをブロックするために使用されます
スレッド 1 は、ブロックするキーストロークをスレッド 2 に送信するように設計されています。スレッド 2 は、すべてのウィンドウ アプリケーションに送信されたすべてのメッセージを読み取り、特定のキーボードからのキーストロークを廃棄します。これら 2 つのスレッドが同期していると正確に言えます。
問題は、Rawinput の実行前にフックが実行されているように見えるため、キーストロークを送信したキーボードを特定できないことです。おそらくフックのタイプを変更する方法がわかりません(低レベルのキーボードフックの使用は避け、ユーザースペースレベルのキーボードフックの使用は避けてください)。
それとも、誰かが私がやりたいことを行う賢い方法を知っていますか?
このリクエストは非常に複雑であることは承知しています。詳細についてはお気軽にお問い合わせください。