2012-05-13 24 views
7

私のコードのどこかにイベントを取得するためにPeekMessageを呼び出すループ関数があります。PeekMessageを使用して入力(マウス+キーボード)以外のすべてのメッセージを取得する方法

は現在、それは次のようになります。

while (PeekMessage(&Message, NULL, 0, 0, PM_REMOVE)) 
{ 
    // Process events 
} 

私は、そのような中WM_KEYDOWNWM_MOUSEMOVE(マウスとキーボードのイベント)などのメッセージを取得したいという意味、別の場所で入力を管理したいと思います私のメインループの別の時間に、別の場所。

PeekMessageの第三及び第四の引数は、返されるメッセージの範囲を定義することを可能にするので、私は提供マクロWM_KEYFIRSTWM_KEYLASTWM_MOUSEFIRSTWM_MOUSELASTを使用し、これを使用することができます。しかし、入力をチェックする2つの範囲と残りのすべての3つの範囲があるため、不便です。

最後のパラメータはフラグで、入力にはPM_REMOVE | PM_QS_INPUTを渡すことができます。しかし、その後、私は他のすべてのメッセージを取得したい、他のループで何を渡すべきですか? PM_QS_EVERYTHING_EXCEPT_INPUTマクロはありません。

これを行うにはどのような方法が最適でしょうか?

+1

最後に存在しないフラグは '〜PM_QS_INPUT'として視覚化できます。これはビット単位のORで' PM_REMOVE'と組み合わせることができます。 – chris

+0

はい、解決策になる可能性があります。しかし、このフラグには、1)どのタイプのメッセージを取り出すか(PM_QS_ *)、2)メッセージ(PM_REMOVE、PM_NOREMOVE、でもPM_NOYIELDとは違う2つのセメント設定したい、そして次のバージョンのWindowsで新しいフラグを設定する可能性があります)。私は実際の値を見ても、2つのセメントを分離するためのマクロは見つかりませんでしたが、最初の16ビットは2番目のビットに予約されています。 – Benlitz

+2

私の間違いは、 '〜PM_QS_INPUT'を使って、そのタイプのフラグに適用されるビットの範囲だけをマスクすることです。脳はそこで失敗しなければならなかった。したがって、前半は0、前半は0、後半のPM_QS_INPUTは1になります。 – chris

答えて

1

「フィルタ」を使用できます。 Win32は "フック"を呼び出し、msdnのSetWindowsHookEx関数を見ています。キーボードとマウスのメッセージ用にスレッド固有のフィルタをインストールすることができます。その後、メンテナンスのキューにメッセージをプッシュし、後から手動でアクセスすることができます(フックから、そのスレッドのパブリックキューから関連メッセージを削除できることがわかっているので、ユーザーキューのみが保持します)。メッセージ)。 しかし、PeekMessageスイッチから直接この使用キューに直接プッシュすることもできます。

関連する問題