6

現在、特定のキーボード (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 の実行前にフックが実行されているように見えるため、キーストロークを送信したキーボードを特定できないことです。おそらくフックのタイプを変更する方法がわかりません(低レベルのキーボードフックの使用は避け、ユーザースペースレベルのキーボードフックの使用は避けてください)。

それとも、誰かが私がやりたいことを行う賢い方法を知っていますか?

このリクエストは非常に複雑であることは承知しています。詳細についてはお気軽にお問い合わせください。

4

3 に答える 3

4

わかりました、Silence Dogood が良い手がかりを教えてくれます:

ライブラリの傍受は私の使用に最適です。ここで見つけることができます:

https://github.com/oblitum/Interception

于 2012-10-30T17:11:18.440 に答える
2

バーコード スキャナー (hid キーボード エミュレーションを使用する) をソフトウェアで赤くし、入力として使用しないようにすることについても、同じことを考えています。

これを見つけましたが、完全なコードではなく、C# を初めて使用するため、使い方がよくわかりません。お役に立てば幸いです。

インターセプト キーボード

于 2013-01-03T16:06:24.857 に答える
1

これを .net アプリケーションに実装する場合、個人的にEasyHookをお勧めします。これにより、キーストロークをインターセプトするだけでなく、非常に使いやすくなります。

于 2013-01-22T18:51:38.900 に答える