#3
by tk-xleader » 2年前
Visual Studioで言語がC++ということなので、Windows APIを直叩きしているという前提で回答するならば、WM_MOUSEMOVE などの入力デバイス系のメッセージは、Foreground状態のWindowに送信されるはずなので、背面のWindowのプロシージャでは受け取れないはずです。
それならどうすれば良いのかといえば、usao さんがおっしゃるように、GetAsyncKeyState やGetCursorPos といったwinapi関数を定期的に呼び出してキーボード・マウスボタンの押下状態やカーソル位置を取得すればよいということになります。
その上でもう少し補足すると、ウィンドウメッセージに頼らないで自力でポーリングをする方法として、次のような方法があります。
1 Windowタイマーを設定し、定期的に発行される WM_TIMER メッセージをウィンドウプロシージャで受け取って入力デバイスの状態をチェックする方法。
2 メッセージループをPeekMessageを使って実装し、メッセージループ内で入力デバイスの状態をチェックする方法。
3 入力デバイスチェック用のスレッドを立てて、入力デバイスチェック用のループを作る方法。
どの方法がいいのかというのは、学生さんがプログラムでのモーターの制御をどの程度の応答精度で行いたいかによります(通常は、1->3の順番で応答精度は高くなるはずです)。
Visual Studioで言語がC++ということなので、Windows APIを直叩きしているという前提で回答するならば、WM_MOUSEMOVE などの入力デバイス系のメッセージは、Foreground状態のWindowに送信されるはずなので、背面のWindowのプロシージャでは受け取れないはずです。
それならどうすれば良いのかといえば、usao さんがおっしゃるように、GetAsyncKeyState やGetCursorPos といったwinapi関数を[u]定期的に呼び出して[/u]キーボード・マウスボタンの押下状態やカーソル位置を取得すればよいということになります。
その上でもう少し補足すると、ウィンドウメッセージに頼らないで自力でポーリングをする方法として、次のような方法があります。
1 Windowタイマーを設定し、定期的に発行される WM_TIMER メッセージをウィンドウプロシージャで受け取って入力デバイスの状態をチェックする方法。
2 メッセージループをPeekMessageを使って実装し、メッセージループ内で入力デバイスの状態をチェックする方法。
3 入力デバイスチェック用のスレッドを立てて、入力デバイスチェック用のループを作る方法。
どの方法がいいのかというのは、学生さんがプログラムでのモーターの制御をどの程度の応答精度で行いたいかによります(通常は、1->3の順番で応答精度は高くなるはずです)。