![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
No.2ベストアンサー
- 回答日時:
こんにちは。
補足いただきました。>>現在はボタンが押されたときしか処理していないようでした、そこで思ったのですが常に処理をするようにするようなメッセージはあるのでしょうか?
//ジョイスティックの状態取得
DIJOYSTATE js;
pJoystick->Poll();
HRESULT ret = pJoystick->GetDeviceState(sizeof(js), &js);
上記の呼び出しを繰り返す事でジョイスティックからボタンや十時キーの状態がリアルタイムに取れる筈です。どこかで一回呼び出しただけでは不十分です。
ウィンドウメッセージと関係なく、常に上記の呼び出しを繰り返さなくては成らない筈です。
常に処理をするには「アイドリングループ」若しくは「マルチスレッド」を使用します。
「アイドリングループ」の方が手っ取り早くて簡単です。「マルチスレッド」は便利ですが、スレッド間でデータを共有する場合「クリティカルセクション」等が必要です。
以下は「アイドリングループ」の方です。
int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int iCmdWnd)
{
MSG msg;
HWND hDlg = ダイアログを開く;
::ShowWindow(hDlg, iCmdWnd);
while(TRUE)
{
if(::PeekMessage(&msg, 0, 0, 0, PM_NOREMOVE))
{
if(!::GetMessage(&msg, NULL, 0, 0))
break;
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
else
{
//アイドリングです。ここで処理し続けます。何回も呼ばれ続けます。
//ジョイスティックのポインタを確認
if(pJoystick)
{
//ジョイスティックの状態取得
DIJOYSTATE js;
pJoystick->Poll();
HRESULT ret = pJoystick->GetDeviceState(sizeof(js), &js);
//js変数にジョイスティックの現在の状態が入っている
}
}
}
return msg.wParam;
}
余談ですが、ダイアログプロシージャの中に以下のメッセージ処理も、有った方が良いかもしれません。
case WM_ACTIVATE:
{
if(pJoystick)
{
const int fActive = LOWORD(wParam);
if(fActive == WA_INACTIVE)
pJoystick->Unaquire();
else
pJoystick->Aquire();
}
break;
}
回答ありがとうございます。
なるほど・・・「アイドリングループ」で組みなおしてみるとうまくいきました。
貴重な回答をありがとうございます。
No.1
- 回答日時:
こんにちは。
>>今の状況としてはジョイパッドの認識は出来ているのですがキー入力が一度、ダイアログボックスをマウスでクリック、または移動した直後でないと反映されないというものです。
>>ここでの反映とはダイアログボックスが更新されないというものではなくキー入力自体が反映されないということです。
ジョイスティックは作った事無いのですが(キーボード・マウスは良く作る)、状況から推測すると、「WM_LBUTTONDOWN」や「WM_MOUSEMOVE」辺りで「IDirectInputDevice::Aquire()」メソッドを呼び出ししているのでは?
「WM_ACTIVATE」や「WM_INITDIALOG」辺りで 「IDirectInputDevice::Aquire()」メソッドを呼び出しているかどうかを確認してみてください。
参考URL:http://www.geocities.co.jp/SiliconValley-Oakland …
この回答への補足
回答ありがとうございます。
説明が不足していたようですので申し訳ありません。
ダイアログボックスのプロシージャでは「WM_INITDIALOG」、「WM_COMMAND」の2つのメッセージのみしか処理していませんのでマウスのクリックなどのメッセージは処理していません。
あと、生成しているのはダイアログボックスのみでした。
現在はボタンが押されたときしか処理していないようでした、そこで思ったのですが常に処理をするようにするようなメッセージはあるのでしょうか?
重ねて質問をして申し訳ありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 (緊急)windowsのタスクバーやアプリ?が反応しない 3 2023/03/28 05:03
- その他(コンピューター・テクノロジー) プリントスクリーンについて 6 2022/11/23 11:17
- iOS これは日本語入力の大発明ですか? 7 2022/12/21 07:17
- Excel(エクセル) Excel 表の作成について 3 2022/06/16 12:15
- テレビ プレステ5が映らなくりました 1 2023/07/13 11:09
- Visual Basic(VBA) VBAコードを張り付け後のエクセルの進め方 2 2023/02/07 18:24
- 政治 大阪府統一地方選について 3 2023/04/18 18:27
- Windows 95・98 Windows11にバージョン アップしました。 2 2023/07/21 18:36
- マウス・キーボード 不良表示キー(キーボード) 3 2022/04/27 10:53
- バイク車検・修理・メンテナンス HONDA PCX125に関する質問です。 拙い文章な上、バイクに関する知識が不十分なため所々分かり 1 2022/08/08 19:52
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBSで応答不要のメッセージボッ...
-
VBA kernel32 の意味
-
VBA、UserFormを前面に出力して...
-
ACCESS側からEXCELの書式を設定...
-
VBスクリプトで「お待ち下さい...
-
VBSの処理中一旦処理を止めて再...
-
エクセルVBAでクリップボード内...
-
メッセージボックスのボタン名変更
-
Excelのワークシートに行を挿入...
-
ASP.NETでのメッセージ画面を出...
-
SendMessage中のメッセージ・ル...
-
VB Loopを一時停止し再開あるい...
-
マウスのクリックを無視したい
-
Excel VBA で処理中断(DoEvents...
-
エディットコントロールへの表示
-
VB6でフォームをリロードしたい
-
マルチスレッドを実現したい
-
EXCEL VBA「Application.Displa...
-
シャットダウン時のExcel強制終...
-
ボタンが押された事を検知する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBSの処理中一旦処理を止めて再...
-
メッセージボックスのボタン名変更
-
VBA kernel32 の意味
-
ACCESS側からEXCELの書式を設定...
-
VBSで応答不要のメッセージボッ...
-
エクセルVBAでクリップボード内...
-
Application.ScreenUpdating=Fa...
-
Excel VBA で処理中断(DoEvents...
-
VBA メッセージボックスを自動...
-
【C#】 あるイベントから別イ...
-
VBA、UserFormを前面に出力して...
-
ASP.NETでのメッセージ画面を出...
-
Excel VBA 自動的に閉じるMsgBox
-
スロットゲームのプログラミング
-
キーボード入力、マウス操作を...
-
<input type="file">タグで「キ...
-
Excelのワークシートに行を挿入...
-
ボタンが押された事を検知する...
-
VB6 コマンドボタン クリック...
-
VCでウエイトをミリ秒でかけ...
おすすめ情報