5

RIDEV_INPUTSINK フラグを使用して未加工の入力を登録するメッセージのみのウィンドウ (ATL::CWindowImpl) があります。つまり、ウィンドウがフォアグラウンド ウィンドウであるかどうかに関係なく、すべての入力を取得します。これは、そのウィンドウのインスタンスが 1 つしかない場合にうまく機能します。

ただし、ウィンドウの複数のインスタンスを作成すると、WM_INPUT メッセージを受け取るのは 1 つだけです (現在 2 つ作成しており、作成する 2 番目のインスタンスだけがメッセージを取得します)。

RegisterRawInputDevices (RIDEV_INPUTSINK | RIDEV_NOLEGACY を使用) は、両方のウィンドウの作成中に成功しています。また、生の入力を受信して​​いないウィンドウはまだ他のメッセージを受信して​​いるため、ウィンドウ自体の問題ではありません...

関連する場合、私は VC11 ベータ版を使用しており、ウィンドウが作成され、さまざまなスレッドでメッセージがディスパッチされます (std::thread を使用)。

これは API の制限ですか (つまり、プロセスごとに 1 つの入力シンクに制限されています)? または、これを機能させる方法はありますか?

前もって感謝します。

編集:

現在の私の現在の回避策は、ウィンドウを 1 つだけにして、入力メッセージを他のウィンドウに渡すことですが、これは混乱しており、機能させたい場合には機能しません (生の入力を必要とする可能性のあるプラグインをロードするアプリ。本当にそのようにする必要がない限り、それらをアプリに登録する必要はありません...)。

4

1 に答える 1

6

MSDN から (ここここ) Raw Input の API 全体は、ウィンドウについてではなく、常にアプリケーションについて話します...つまり、生の入力を登録するアプリケーションは、OS によって 1 つのエンティティとして処理されます...間接的に証明されました2 番目の受信ウィンドウの登録 - OS が生の入力をアプリケーションに配信するため、最初のウィンドウは受信を停止しました (シンクとして正確に onw ウィンドウで表されます)。

于 2012-03-18T05:46:05.680 に答える