トップページ > 記事閲覧
CheckHitKey、GetMouseInput不具合?
名前:タンタル 日時: 2020/01/07 15:01

C#で現在動作させているのですが、タイトルのCheckHitKeyやGetMouseInputの戻り値が常に0になります。 DX.DxLib_Init成功後、下記の通り実装していますが、何故かダメです。。 ※描画等、問題なく出来ているため、ある程度コードを省略して記載しました。 コントロール上に描画しています。 バージョンは、DXライブラリ Ver3.21c using DxLibDLL; int ret=0; if (DX.DxLib_Init() < 0) {  return -1; } while (true) {  ret = DX.GetMouseInput(); // フォーカス状態でコントロール内をマウスクリックしても常に0 } DX.DxLib_End(); return 0;
メンテ

Page: 1 |

Re: CheckHitKey、GetMouseInput不具合? ( No.1 )
名前:タンタル 日時:2020/01/07 17:12

下記にログを添付しました。 DirectInput関係初期化のログが、何もない点が気になってます。 0:ChangeWindowMode実行 0:ChangeWindowMode実行 10:ウインドウモードフラグが立てられました 10:DXライブラリの初期化処理開始 30: システムの情報を出力します 40: DXライブラリ Ver3.21c 50: 論理プロセッサの数 : 4 60: OS Windows7 ( Build 7601 Service Pack 1 ) 180: 現時点のCPU動作速度:大体2.12GHz 185: MMX命令を使用します 191: SSE命令が使用可能です 197: SSE2命令が使用可能です 203: CPUベンダ:GenuineIntel 233: CPU名:Intel(R) Core(TM) i5-4200U CPU @ 1.60GHz 239: COMの初期化... 失敗 252: 非同期読み込み処理の初期化...成功 264: ファイルアクセス処理の初期化...成功 278: メモリ総量:8089.06MB 空きメモリ領域:3323.98MB 299: タイマーの精度を検査します 307: 精度結果 更新回数 マルチメディアタイマー:0 パフォーマンスカウンター:60 314: パフォーマンスカウンターを使用します タイマー精度 : 2240.957000 KHz 328: ソフトの二重起動検査... 二重起動はされていませんでした 348: IMEを無効にしました 559: パッドの数は 0 個です 566: 入力関連の初期化をしました 602: DirectSound の初期化を行います 608: DirectSound インターフェースの取得を行います.... 成功 672: 引き続きインターフェースの初期化処理... 成功 796: DirectSound デバイスを列挙します 805: Module Name : Description : プライマリ サウンド ドライバー 811: Module Name : {0.0.0.00000000}.{0a3d9a7d-03d2-4292-9ab9-4336dcaeaa1c} Description : Speakers / HP (IDT High Definition Audio CODEC) 818: 最大サンプリングレート:200.00KHz 最小サンプリングレート:0.10KHz 826: 総サウンドメモリ領域:0.00KB 空きサウンドメモリ領域:0.00KB 833: 利用可能サンプリング精度 839: Primary 16bit = OK 8bit = OK 846: Secondary 16bit = OK 8bit = OK 853: 利用可能チャンネル 859: Primary MONO = OK STEREO = OK 866: Secondary MONO = OK STEREO = OK 873: DirectSound の初期化は正常に終了しました 880: d3d11.dll の読み込み.... 成功 898: dxgi.dll の読み込み.... 成功 912: API CreateDXGIFactory1 のアドレスを取得します.... 成功 927: IDXGIFactory1 を作成します.... 成功 946: API D3D11CreateDevice のアドレスを取得します.... 成功 960: IDXGIAdapter を取得します.... 成功 973: Direct3D 11 FeatureLevel 11_0 以上を対象とします 979: ID3D11Device オブジェクトを取得します.... 成功 1013: IDXGIDevice1 を取得します.... 成功 1075: IDXGIDevice1->SetMaximunFrameLatency( 1 ); を実行しました 1102: [ウインドウモード 1366x768] 1120: IDXGISwapChain を作成します.... 成功 1145: IDXGIFactory->CreateSwapChain の戻り値:0x00000000 1166: IDXGIOutput を取得します.... 成功 1188: Graphics Device:Intel(R) HD Graphics Family 1198: 画面のフォーマットは DXGI_FORMAT_R8G8B8A8_UNORM です 1206: 16bit Zバッファフォーマットは DXGI_FORMAT_D16_UNORM です 1216: 24bit Zバッファフォーマットは DXGI_FORMAT_D24_UNORM_S8_UINT です 1225: 32bit Zバッファフォーマットは DXGI_FORMAT_D32_FLOAT です 1234: 16bit カラーフォーマットは DXGI_FORMAT_R8G8B8A8_UNORM です 1244: 32bit カラーフォーマットは DXGI_FORMAT_B8G8R8X8_UNORM です 1258: アルファ付き 16bit カラーフォーマットは DXGI_FORMAT_R8G8B8A8_UNORM です 1271: アルファ付き 32bit カラーフォーマットは DXGI_FORMAT_R8G8B8A8_UNORM です 1281: アルファテスト用 16bit カラーフォーマットは DXGI_FORMAT_R8G8B8A8_UNORM です 1291: アルファテスト用 32bit カラーフォーマットは DXGI_FORMAT_R8G8B8A8_UNORM です 1301: DXT1テクスチャフォーマットは DXGI_FORMAT_BC1_UNORM です 1311: DXT2テクスチャフォーマットは使えません 1329: DXT3テクスチャフォーマットは DXGI_FORMAT_BC2_UNORM です 1338: DXT4テクスチャフォーマットは使えません 1348: DXT5テクスチャフォーマットは DXGI_FORMAT_BC3_UNORM です 1358: ABGR 整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16B16A16_UNORM です 1369: ABGR 浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16B16A16_FLOAT です 1380: ABGR 浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32G32B32A32_FLOAT です 1390: 1チャンネル整数 8 ビット型カラーフォーマットは DXGI_FORMAT_R8_UNORM です 1402: 1チャンネル整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16_UNORM です 1412: 1チャンネル浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16_FLOAT です 1422: 1チャンネル浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32_FLOAT です 1432: 2チャンネル整数 8 ビット型カラーフォーマットは DXGI_FORMAT_R8G8_UNORM です 1442: 2チャンネル整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16_UNORM です 1453: 2チャンネル浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16_FLOAT です 1465: 2チャンネル浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32G32_FLOAT です 1476: 描画用 16bit カラーフォーマットは DXGI_FORMAT_B8G8R8X8_UNORM です 1485: 描画用 32bit カラーフォーマットは DXGI_FORMAT_B8G8R8X8_UNORM です 1495: 描画用アルファ付き 32bit カラーフォーマットは DXGI_FORMAT_R8G8B8A8_UNORM です 1505: 描画用 ABGR 整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16B16A16_UNORM です 1524: 描画用 ABGR 浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16B16A16_FLOAT です 1539: 描画用 ABGR 浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32G32B32A32_FLOAT です 1551: 描画用1チャンネル整数 8 ビット型カラーフォーマットは DXGI_FORMAT_R8_UNORM です 1562: 描画用1チャンネル整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16_UNORM です 1587: 描画用1チャンネル浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16_FLOAT です 1600: 描画用1チャンネル浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32_FLOAT です 1613: 描画用2チャンネル整数 8 ビット型カラーフォーマットは DXGI_FORMAT_R8G8_UNORM です 1625: 描画用2チャンネル整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16_UNORM です 1635: 描画用2チャンネル浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16_FLOAT です 1645: 描画用2チャンネル浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32G32_FLOAT です 1655: 使用する機能レベル:D3D_FEATURE_LEVEL_11_0 1665: 同時にレンダリングできるバッファの数:8 1676: 最大テクスチャサイズ 幅:16384 高さ:16384 1686: 標準描画用の頂点バッファの作成.... 成功 1706: シェーダーコード関係の初期化.... 成功 1848: 各種シェーダー用定数バッファの作成.... 成功 2018: 各種 ID3D11InputLayout の作成.... 成功 2134: 画像の単純転送処理の初期化... 成功 2170: 深度バッファを作成します.... 成功 2199: フォントの初期化を行います 2215: フォントの初期化は正常に終了しました 2226: 文字コードバッファの初期化を行います... 完了しました 2310:DXライブラリの初期化処理終了 20701:フォントの初期化を行います 20727:フォントの初期化は正常に終了しました 20761:d3d11.dll の解放 1 20777:dxgi.dll の解放 1 20810:Direct3D11 のオブジェクト数を出力 20825:Direct3D11 のオブジェクト合計数 : 0 20844:入力関連の終了処理... 完了 20871:DirectSound の終了処理は正常に終了しました 20914: 20925:Alloc memory dump 20938: Total size:0(0.000kb) Alloc num:0 20949:
メンテ
Re: CheckHitKey、GetMouseInput不具合? ( No.2 )
名前:管理人 日時:2020/01/08 00:14

DXライブラリは定期的に ProcessMessage を呼ぶ必要があります キー入力やマウス入力も ProcessMessage を呼ばないと機能しませんので while (true) {  ret = DX.GetMouseInput(); // フォーカス状態でコントロール内をマウスクリックしても常に0 } こちらの部分を while (DX.ProcessMessage == 0) {  ret = DX.GetMouseInput(); // フォーカス状態でコントロール内をマウスクリックしても常に0 } このようにして、1ループ毎に ProcessMessage を呼ぶようにしてください m(_ _)m
メンテ
Re: CheckHitKey、GetMouseInput不具合? ( No.3 )
名前:タンタル 日時:2020/01/08 13:08

管理人様 ご回答ありがとうございます。 上記(DX.ProcessMessage)にして、動作確認してみましたがやはり変化はありませんでした。。 キーボードやマウス関連以外のDX APIは問題なく動作しているようですので、何かしら不具合の可能性はないでしょうか?
メンテ
Re: CheckHitKey、GetMouseInput不具合? ( No.4 )
名前:管理人 日時:2020/01/08 23:03

うーん謎ですね…手元では問題なくマウスの入力もキーボードの入力も取得出来ています… 私の環境で正常に入力が取得できることを確認できたプロジェクトをこちらにアップしてみましたので、 よろしければタンタルさんの環境でも正常に動作するか試してみていただけないでしょうか? m(_ _)m https://dxlib.xsrv.jp/temp/DxLibDotNetTest2019.zip ( 中にある DxLibDotNetTest2019.sln を開いて Debug ビルドを実行すると画面の左上に GetMouseInput の結果が、 画面中心には上下左右キーで動く円が表示されます )
メンテ
Re: CheckHitKey、GetMouseInput不具合? ( No.5 )
名前:タンタル 日時:2020/01/09 12:52

管理人様 上記環境アップしていただき有難う御座いました。 ただちょっと説明不足なところがあり、状況が違うので下記に環境について記載させて頂きました。 頂いた内容と明らかに異なる点ですが、 描画先を変更するため、DX.SetUserWindow(this.Handle)にて、別のコントロールを指定しております。 あと、当方のDXログですが、DirectInput関係初期化処理が全くなく、COMの初期化に失敗しています、これは何か設定か何かで変わります? ちなみに、普通にC++版(VS C++)で実行した場合は、上記のログが全てでております。。
メンテ
Re: CheckHitKey、GetMouseInput不具合? ( No.6 )
名前:管理人 日時:2020/01/09 23:38

> 描画先を変更するため、DX.SetUserWindow(this.Handle)にて、別のコントロールを指定しております。 > あと、当方のDXログですが、DirectInput関係初期化処理が全くなく、COMの初期化に失敗しています、これは何か設定か何かで変わります? はい、恐らく SetUserWindow による影響だと思います SetUserWindow に渡すウィンドウハンドルの種類などによって現象に差異がありますので、 よろしければ本件の現象が発生する簡単なプロジェクトを作成して、メールで BQE00322(あっとまーく)nifty.com ( (あっとまーく) を @ に置き換えてください ) に送っていただけないでしょうか? m(_ _)m 本件の現象を回避する方法や、実現されたいことの代替手段があるかなどを調べてみたいと思います > ちなみに、普通にC++版(VS C++)で実行した場合は、上記のログが全てでております。。 こちらは、C#版と全く同じこと( SetUserWindow( Handle ); を行うなど )を C++版で行ったら、 C++版では本件の不具合が発生しなかった、ということでしょうか?
メンテ
Re: CheckHitKey、GetMouseInput不具合? ( No.7 )
名前:タンタル 日時:2020/01/15 10:10

管理人様 返信がだいぶ遅くなりました><; SetUserWindowに渡すウィンドハンドルの種類によっては現象がありえるのですね。 >こちらは、C#版と全く同じこと( SetUserWindow( Handle ); を行うなど )を C++版で行ったら、 >C++版では本件の不具合が発生しなかった、ということでしょうか? はい、C++版では本件の不具合は発生しておりません。おそらくC++版ではSetUserWindow APIを使用していないためかと思います。 >本件の現象を回避する方法や、実現されたいことの代替手段があるかなどを調べてみたいと思います。 有難う御座います!本当に助かります! かなりボリュームのあるプロジェクトのため、ある程度対象となるコントロールのみとなるよう切り離したプロジェクトを、 教えていただいたメールアドレスに添付させて頂きたいと思います。 少し時間かかりますけど、宜しくお願い致します。
メンテ
Re: CheckHitKey、GetMouseInput不具合? ( No.8 )
名前:管理人 日時:2020/01/16 00:40

了解です メールお待ちしております
メンテ
Re: CheckHitKey、GetMouseInput不具合? ( No.9 )
名前:タンタル 日時:2020/03/02 11:49

管理人様 だいぶ返信が遅くなりましたが、本件の現象が出るプロジェクトを簡単に作成しましたので、メールにて添付させて頂きました。 簡単に説明しますと、 メイン(sample.cs)からdemo.co(=UserControl)を参照し、 demo.cs内のoverrideしたOnLoadで、下記スレッドを起動しています。 結果、下記のThreadKeyCheck()で、Escapeキー又はマウス右クリックを取得できた場合にメッセージ出る筈ですが、出ません。。 public void ThreadKeyCheck() { if (DX.DxLib_Init() < 0) { return; } while (DX.ProcessMessage() == 0) { if (DX.CheckHitKey(DX.KEY_INPUT_ESCAPE) == 1) MessageBox.Show("Input Escape"); if (DX.GetMouseInput() == DX.MOUSE_INPUT_RIGHT) MessageBox.Show("Input Mouse Right"); } DX.DxLib_End(); } 以上、お手数をお掛けしますがご確認の上、動作検証を宜しくお願い致します。
メンテ
Re: CheckHitKey、GetMouseInput不具合? ( No.10 )
名前:管理人 日時:2020/03/03 00:57

ファイルのアップありがとうございます 拝見したところ、私もよく理解していませんでしたがどうも Control のウィンドウハンドルだと 正常に動作しないようです メインウィンドウのウィンドウハンドルを SetUserWindow に設定した上で、更に DirectInput を協調モードで使用するとキーとマウスの入力を取得できましたので、よろしければ 以下の変更を試してみてください m(_ _)m sample.cs OnLoad の dm.Show(); の前の行に DX.SetUserWindow(this.Handle); を追加 demo.cs this.threadKeyCheck = new System.Threading.Thread(new ThreadStart(ThreadKeyCheck)); threadKeyCheck.IsBackground = true; threadKeyCheck.Priority = ThreadPriority.Normal; threadKeyCheck.Start(); ↑こちらのコードを OnLoad ではなく、demo() の InitializeComponend(); の後の行に移動 DX.SetUseDirectInputFlag(DX.TRUE); // DirectInput を使用する DX.SetKeyExclusiveCooperativeLevelFlag(DX.TRUE); // キー入力に DirectInput の協調モードを使用する ↑このコードを ThreadKeyCheck() の冒頭( DxLib_Init の前 )に追加 この変更で手元では ESCキーと右クリックが反応しました
メンテ
Re: CheckHitKey、GetMouseInput不具合? ( No.11 )
名前:タンタル 日時:2020/03/03 14:38

管理人様 ご確認頂き有難う御座います。 確かにメインHandleに設定した場合は、キーマウス関連を捕捉できているようです。 ただ、ユーザーコントロールのHandleでも、キーマウス関連以外の描画等は問題なく出来ているため、 何故コントロールハンドルだと捕捉できないのか疑問です。 コントロール(=画面)ハンドルで、描画等をしたいため、何か良い方法がないか検討してみます。
メンテ
Re: CheckHitKey、GetMouseInput不具合? ( No.12 )
名前:kanamaru 日時:2020/03/03 18:37

以下に書かれていることはC#をたまに使うのでちょっと調べてみただけなので間違っているかもしれません。 コントロールにフォーカスが無いとキーイベントは捕捉できないそうです。(たぶんマウスも同じ) どんなコントロールなのかはわかりませんが、 もしかしてフォームにフォーカスがあってコントロールにフォーカスがあるわけではないのかもしれません。 (フォームにはフォーカスがあるから捕捉できた) なのでフォームのイベントの中でコントロールにフォーカスを設定すればいいのかもしれません。 間違っていたらすいません。
メンテ
Re: CheckHitKey、GetMouseInput不具合? ( No.13 )
名前:管理人 日時:2020/03/04 02:25

> ただ、ユーザーコントロールのHandleでも、キーマウス関連以外の描画等は問題なく出来ているため、 > 何故コントロールハンドルだと捕捉できないのか疑問です。 DXライブラリのソースを改めて確認したところ原因が分かりました 標準ではキーやマウスの入力はウィンドウメッセージを介して取得しているのですが、 SetUserWindow で指定されたウィンドウのメッセージは SetUserWindow を呼んだ側が 行うことになっているので( DXライブラリ側はウィンドウメッセージを処理しないので ) 結果、キーやマウスの入力も処理されず、CheckHitKey なども機能しない、ということでした DirectInput を使用する場合は、ウィンドウメッセージを介さずに入力状態を取得するので ウィンドウメッセージをDXライブラリ側で処理しない場合も入力を取得できるのですが、 DirectInput を使用する場合は、使用するウィンドウはメインウィンドウのハンドルでないと DirectInput 初期化に失敗するので、コントロールのハンドルを SetUserWindow に渡した場合は、 やはり入力を取得できない( DirectInput の初期化に失敗するから )ということでした > コントロール(=画面)ハンドルで、描画等をしたいため、何か良い方法がないか検討してみます。 SetScreenFlipTargetWindow という関数で ScreenFlip を呼んだときに裏画面の画像が転送される先の ウィンドウを変更することができますので、SetUserWindow で指定するのはメインウィンドウにして、 SetScreenFlipTargetWindow にコントロールのハンドルを渡して呼べば 『コントロールに描画結果表示 + キー入力も有効』を実現できます よろしければお試しください m(_ _)m > kanamaruさん ご情報ありがとうございます フォーカスの概念って、複雑ですね… ( 一般的なウィンドウアプリは殆ど作ったことが無いので、そのあたりの煩雑さには疎いです… ) フォーカスの有る無しに関わらず入力状態を取得するために DirectInput を使用したのですが、 DirectInput はメインウィンドウ以外では初期化に失敗するので、コントロールを SetUserWindow に 指定するとやはり入力を取得できない、ということでした
メンテ
Re: CheckHitKey、GetMouseInput不具合? ( No.14 )
名前:タンタル 日時:2020/03/04 09:43

管理人様 ご確認して頂き有難うございます。 私の方でも、何か解決策が無いかいろいろ試してみました。 SetUserWindowにメインハンドルを渡した後に、SetUserChildWindowにメイン側コントロール配下にある ユーザーコントロールハンドルを指定し、その同じコンテキスト上で描画やキー補足などを行うようにしましたところ問題なく動作するようです。 >SetScreenFlipTargetWindow という関数で ScreenFlip を呼んだときに裏画面の画像が転送される先の >ウィンドウを変更することができますので、SetUserWindow で指定するのはメインウィンドウにして、 >SetScreenFlipTargetWindow にコントロールのハンドルを渡して呼べば >『コントロールに描画結果表示 + キー入力も有効』を実現できます SetScreenFlipTargetWindowをScreenFlipの直前に入れて、裏画面の転送先変更でも目的が果たせそうか実装してみたいと思います。
メンテ
Re: CheckHitKey、GetMouseInput不具合? ( No.15 )
名前:タンタル(解決) 日時:2020/03/04 12:55

kanamaru 様 情報提供して頂きまして有難うございました。 今回マウスフォーカスの方は当たっておりましたが、貴重な情報となるやもしれませんので情報助かります。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存