ページ 11

2つのexeで動かしたいのですが…

Posted: 2022年1月18日(火) 17:11
by 学生
学校の課題で力学体験装置を作っているのですが、Unityでマウスの座標に合わせて映像が変化するプログラムを作り、visuals tudioでマウスの座標に合わせてモータを制御するプログラムを組んだのですが、2つのexeを同時に起動させても手前のウィンドウのプログラムでしか座標の取得やキー入力が反映されないのですが、2のexeで同時に座標などを取得するのは出来ないのでしょうか?もし、解決法などありましたら教えてください。ちなみに言語はUnityがC♯でモータ制御プログラムはC++です。

Re: 2つのexeで動かしたいのですが…

Posted: 2022年1月18日(火) 18:41
by usao
Unityの事は知らんけども,
C++側に関しては
ウィンドウにメッセージが降ってくるのを受動的に待つような形とせずに,能動的に状態判定すればいいんじゃないの?
(Win32 なら GetAsyncKeyState とか GetCursorPos とか使って)

Re: 2つのexeで動かしたいのですが…

Posted: 2022年1月19日(水) 00:21
by tk-xleader
Visual Studioで言語がC++ということなので、Windows APIを直叩きしているという前提で回答するならば、WM_MOUSEMOVE などの入力デバイス系のメッセージは、Foreground状態のWindowに送信されるはずなので、背面のWindowのプロシージャでは受け取れないはずです。

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