• ベストアンサー

ダイアログボックスを利用したキーコンフィグ

現在、DirectInputを利用してジョイパッドのキーコンフィグ機能を作成しているのですが問題が発生したので質問させていただきます。 今の状況としてはジョイパッドの認識は出来ているのですがキー入力が一度、ダイアログボックスをマウスでクリック、または移動した直後でないと反映されないというものです。 ここでの反映とはダイアログボックスが更新されないというものではなくキー入力自体が反映されないということです。 自分でもよく考えたのですがお手上げ状態です。

質問者が選んだベストアンサー

  • ベストアンサー
回答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; }

GCShuji
質問者

お礼

回答ありがとうございます。 なるほど・・・「アイドリングループ」で組みなおしてみるとうまくいきました。 貴重な回答をありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

 こんにちは。 >>今の状況としてはジョイパッドの認識は出来ているのですがキー入力が一度、ダイアログボックスをマウスでクリック、または移動した直後でないと反映されないというものです。 >>ここでの反映とはダイアログボックスが更新されないというものではなくキー入力自体が反映されないということです。  ジョイスティックは作った事無いのですが(キーボード・マウスは良く作る)、状況から推測すると、「WM_LBUTTONDOWN」や「WM_MOUSEMOVE」辺りで「IDirectInputDevice::Aquire()」メソッドを呼び出ししているのでは?  「WM_ACTIVATE」や「WM_INITDIALOG」辺りで 「IDirectInputDevice::Aquire()」メソッドを呼び出しているかどうかを確認してみてください。

参考URL:
http://www.geocities.co.jp/SiliconValley-Oakland/9582/GamePrg/prg04.htm
GCShuji
質問者

補足

回答ありがとうございます。 説明が不足していたようですので申し訳ありません。 ダイアログボックスのプロシージャでは「WM_INITDIALOG」、「WM_COMMAND」の2つのメッセージのみしか処理していませんのでマウスのクリックなどのメッセージは処理していません。 あと、生成しているのはダイアログボックスのみでした。 現在はボタンが押されたときしか処理していないようでした、そこで思ったのですが常に処理をするようにするようなメッセージはあるのでしょうか? 重ねて質問をして申し訳ありません。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ダイアログボックスに入れた字が半分下がる?

    ダイアログボックスに文字を入力して ファンクションキーなどで変換すると 一瞬、その単語や文章が 半分だけ下に下がり、 上半分だけ見える状態になるのですが、 これは何でしょう?どうしたら直るのでしょうか?

  • kindleでパッドをマウスのように使う方法

    古いkindleFireを使用していますが、 bluetoothマウスをつなぐことができないのでオフィス系ソフトがあまりうまく使えず難儀しています。 そこで、 マウスは繋げないまでもbluetoothのジョイパッドなどは接続できますので、 kindleを騙し、ジョイパッドをマウスとして認識させるとか、 なんらかマウスらしく振舞わせることは可能でしょうか。 ※マウスをジョイパッドと騙したうえで、 ※さらにマウスとして使えれば尚良いです。

  • ダイアログ中のタブキーによるカーソルの移動

    MFCでダイアログを使ったアプリケーションを 作りました。 実行時に、ダイアログで 入力項目が10個くらいあるのですが、 タブキーで移動しようとすると、 カーソルが入力ボックス並びとは全く関係なく、 あっちこっち飛んでしまいます。 どうやら入力ボックスを作った順番に 飛んでいるらしい?のです。 入力ボックスの順にタブキーが移動するように できる方法がありましたら、 教えてください。 参考HPやヒント、キーワードだけでも 大変助かります。 よろしくお願いします。

  • DirectInputのキーボードがキーロガーに?

    現在 フレームを単位としてキーボードの状態変化をリプレイデータとして保存出来る DirectXを使用したゲームを作っているのですが 使用中のセキュリティソフトが DirectInputでGUID_SysKeyboardを使ってGetDeviceStateでキーボードの入力情報を操作しようとすると 「キーロガーの疑いがあります」と言ってきます。 現在のところはデフォルト動作(?)で許可はしているようですが WindowsAPIのウインドウメッセージでキーボードからの入力情報を操作しながら 同時にジョイパッドからの入力情報はDirectInput経由で操作 としていた時は出てなかった気がするので たぶんDirectInputでキーボードの入力情報をいじろうとした場合に出るのでは? と思うのですが SetCooperativeLevelで指定しているフラグは DISCL_FOREGROUND|DISCL_NONEXCLUSIVE  ですが、これで問題ないと考えていますし、害のある動作をするつもりは毛頭なく また、WindowsAPIからジョイパッドの操作情報を制御する、という事はまだ試していませんが、聞いた話では2つまでしか受け取れない(?)ようで、一つのPCで少なくとも4人ぐらいまでは同時プレイできるゲームにしたいので それがあってるなら、出来ればDirectInputがよく そして、ジョイパッドとキーボードで使うAPIの系統を変えるよりかは、DirectInputならDirectInputで統一、としておく方がよりシンプルで直感的なコードになりやすいと思うので、出来ればそうしたいのですが セキュリティソフトを全くいじらずに これを防ぐ方法はないでしょうか? あるいは、それを望む場合は (これが「結構細かい話でこの場合一般的に言って、ということはない」というのであれば) ・たぶん、キーボードについてはDirectInputを使ったらその時点で無理ではないか ・よって、その表示を防ぐにはキーボードについてはWindowsAPIサイドから、普通のウインドウメッセージを使ってやるべき ということでしょうか?

  • ゲームパッドにキーボードを割り当てたいのです

    PCゲームをジョイパッドでやろうと思うのですが、ゲームソフトの設定ではジョイパッドを使うことができません。 それでフリーソフトでジョイパッドにキーボードを割り当てできるソフトを昔使ってたのですが忘れてしまって・・・・ わかる人がいましたら教えてくださいませ。 ゲームパッドの十字キーでマウスを操作して ゲームパッドのボタンにそれぞれキーを割り当てしました(エンターとかスペースキーとか)

  • ダイアログボックスを非表示にしたい

    WinXP Excel2003SP2を使用しています。 入力画面を開くたびに以下のメッセージがでるんですが、 このダイアログボックスを表示させずに必ず[更新する]で開くようにすることはできませんか? このブックには、ほかのデータソースへのリンクが含まれています。 ・リンクを更新すると、Excelは最新のデータを取り込もうとします。 ・リンクを更新しないと、以前の情報が使用されます。 注意:データリンクは許可なく機密情報にアクセスして共有するのに使用される可能性があります。 また、その他の問題を起こす可能性のある操作に使用される場合があります。 このブックの作成元が信頼できない場合は、リンクを更新しないでください。 更新する    更新しない     ヘルプ

  • ジョイパッドのボタンをマウスやキーボードへ割当てる

    マウスやキーボードをジョイパッドに割り当てるツールは JOY TO KEY など色々存在しているようですが、 それとは逆にジョイパッドのボタン1やボタン2などを マウスやキーボードに割り当てるツールはないのでしょうか?

  • ジョイパッドのキー設定について

    ジョイパッドでオンラインゲームをしています。 ジョイパッドのキー設定にJoyToKeyを使っていますが認識しないコマンドなどもあるのでちょっと不便です。 フリーのものでここまで使い勝手がいいのは助かってますがorz そこでお聞きしたいのですがJoyToKeyのようにコマンドでも設定できて、連射等もできるフリーソフトを知っていれば教えていただきたいです。 有料の物でも歓迎です。 JoyAdapterというのも良く見ますがパッドでマウスポインタを動かせるものですかね…?少し難しそうだったので手をつけられませんでした。 JoyAdapterでも設定方法があるなら教えていただきたいです。 よろしくお願いいたします。

  • ファイルを保存した直後に、フォルダを開くダイアログボックスが表示されてほしい。

    WindowsXPを使用しています。 CSVファイル等をデスクトップ上のフォルダに保存すると、 直後にフォルダを開くダイアログボックスが画面上に展開されて いたのに、ある日突然展開されなくなりました。 しかたがないので、デスクトップ上にあるフォルダをマウスで クリックして開いていますが不便です。 元の様にするには、どうしたらよいか教えて下さい。御願いします。

  • ダイアログボックスで、マウスを使わずにショートカットキーでいきなりOKで閉じる

    ダイアログボックスで、マウスを使わずにショートカットキーでいきなりOKで閉じる方法を教えて下さい。 と言っても何を言っているのか解らないかもしれないので、具体例を書きます。 EXCEL2000のメニューの「表示」-「ヘッダーとフッター」を選択(ALT+Vキー、Hキー)すると、 「ページ設定」という画面が開きます。 「フッターの編集」ボタンを押下(ALT+U)すると、 「フッター」という子画面が開きます。 「左側(L)」に何か文字を入れたら、マウスを使わずに【そのまま】OKボタンを押してその画面を閉じたいのですが、どうすればよいでしょうか。 エンターキーを押すと、「左側(L)」で改行が入るだけで、OKにはなりません。 TABキーを繰り返し押せばOKには行けるのですが、 それは面倒なので、ちょくにOKで閉じたいのです。 また、 ALT+F4 や ALT+SPACE、C で画面を閉じることはできますが、 OKにはなりません。 上で書いた「フッターの編集」ボタン(ALT+U)のように、 OKボタンにも、括弧の中に下線付きのアルファベットが書いてあればいいのですが、 残念なことに、OKボタンには「OK」としか書いてありません。 以上書いたのは一例で、 私の知りたいのは、ダイアログボックス一般の話です。 なお、VBAなどを使うつもりはないです。 方法がなければ、それで仕方ないので、そのようにご回答下さい。