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