3

Windows でグローバル USB マウス イベントをキャプチャして記録する最良の方法は何ですか? 低レベルのマウス コールバックを使用して、小さなデータ キャプチャ プログラムを既に作成しました。ただし、これは私にとって十分な低レベルではありません。このアプローチにより、実際には相対的な動きである実際のマウスイベントをキャプチャするのではなく、画面上のマウスカーソルの位置 (つまり、画面座標) をキャプチャできます (delta-x を考えてください)。およびデルタ-y)。

各イベントでの位置の増分を確認できますが、画面座標が 0 と画面の幅/高さの間でクリップされるため、一部のデータが失われます。また、ゲームのようなフルスクリーン プログラムが画面の解像度を変更したり、マウス イベントに影響を与える可能性のある何かを行ったりするとどうなるかわかりません。

SetWindowsHookExUSBマウスイベントをフックよりも低いレベルで記録するユーザーモードの方法は他にありますか? Windows による処理の前に、物理的なマウス イベントを取得したいと考えています。

4

1 に答える 1

5

他に誰も答えていないので、これまでにわかったことを報告します。私が知る限り、Windows でマウス データを記録する方法は少なくとも 5 つあります。

  1. LowLevelMouseProcコールバック メカニズム。このアプローチの制限は、マウスから受け取った生データではなく、画面上のマウス カーソルの位置を報告することです。これは、データがすでに処理されていることを意味します。

  2. マウス (またはその他の HID デバイス) から送信された生データをキャプチャする生入力 API 。

  3. DirectInputを使用すると、生のマウスとキーボード (およびその他のデバイス) のデータを最小限の遅延でキャプチャできます。DirectInput の状況は、古い API とそれを置き換える新しい API であるため、少し混乱します。XInput は、古い API がサポートしていたすべてのデバイスをサポートしているわけではありません。

  4. ユーザー モード プログラムでカーネル レベルのETW トレースをキャプチャできるようにするイベント トレース API 。

  5. 最下位レベルでマウス USB トラフィックをキャプチャする KMDF フィルター デバイス ドライバーを作成します。

最後のソリューションは、最も複雑で強力なソリューションです。実際にそれを行う商用アプリケーションはほとんどありません (さらに!)。例として、BusHound があります。

4番目のソリューション(ETWアプローチ)についてはよくわかりません。どうやら、最近のバージョンの Windows で最適に動作するようです。私が考えているのと似たようなことをするサンプル プログラムは見つかりませんでした (つまり、生のマウス イベントを記録します)。また、単純なテスト プログラムでさえ、かなりの労力をかけて作成する必要があるほど複雑に思えます。最後に、実際のマウス レポートを取得できるかどうかはわかりません。

2 番目のソリューションである未加工の入力 API は、驚くほど使いやすいものです。ほんの数時間でそれを使用する簡単なプログラムを作成できました。ただし、これには大きな制限があります。アプリケーションのウィンドウに送信される WM_INPUT メッセージに基づいているためです。タイミングが重要な場合 (私の場合はそうです)、アプリケーションのメッセージ ループがメッセージを順次処理するため、このアプローチは制限されます。したがって、マウス イベントが USB ポートによってキャプチャされてから、適切なメッセージ ハンドラが呼び出されるまでの遅延は、固定されていないか、制限されていません。

全体として、私は質問に対する簡単な答えを思いつきませんでした。

于 2013-06-01T23:15:11.257 に答える