トップページ > 記事閲覧
MakeKeyInput の引数で終了処理が実行されない。
名前:どぶろく 日時: 2022/09/26 23:23

ウィンドウの右上の終了ボタンを押すと MessageBox 以下の終了処理が実行されずに終了してしまいます。 MakeKeyInput の3番目の引数を TRUE にすると MessageBox 以下が実行されます。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int InputHandle ; ChangeWindowMode(TRUE); if( DxLib_Init() == -1 ) return -1 ; // キー入力ハンドルを作る(キャンセルなし全角文字有り数値入力なし) InputHandle = MakeKeyInput( 50 , FALSE , FALSE , FALSE ) ; // この引数の設定だと実行されない //InputHandle = MakeKeyInput( 50 , FALSE , TRUE , FALSE ) ; // 3番目の引数が TRUE だと実行される while( !ProcessMessage() ) { DrawString(100, 100, "インプット", GetColor(255, 255, 255)); } MessageBox(NULL, "", "", MB_OK); // ここから実行されない DeleteKeyInput( InputHandle ) ; // 用済みのインプットハンドルを削除する DxLib_End() ; return 0 ; }
メンテ

Page: 1 |

Re: MakeKeyInput の引数で終了処理が実行されない。 ( No.1 )
名前:管理人 日時:2022/09/27 01:50

ご報告ありがとうございます 手元の環境で載せていただいたプログラムを実行してウィンドウ右上の終了ボタンで終了してみたのですが、 問題なく MessageBox のメッセージボックスが表示されました 現在の最新バージョンでは直っているかもしれませんので、よろしければこちらの 暫定最新バージョンをお試しください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
メンテ
Re: MakeKeyInput の引数で終了処理が実行されない。 ( No.2 )
名前:どぶろく 日時:2022/10/05 14:45

最新のバージョンでもダメでした。 ちなみに古いバージョンを調べたところ 3.18c からダメになるようです。 3.18a 以前なら正常に終了します。 ちなみに私の開発環境は Windows7、BorlandC++5.5、VC++2008、VC++2013 です。 早く新しいPCを買いたいのですがハード的なものやネット接続などが良く分からないです。 2Dのゲームが作れれば良いのでハイスペックなPCはいらないのですが・・・
メンテ
Re: MakeKeyInput の引数で終了処理が実行されない。 ( No.3 )
名前:管理人 日時:2022/10/07 01:46

ご情報ありがとうございます 手元の Windows7 環境で現象を確認できました ただ、私の環境では3番目の引数が TRUE でも実行されませんでした 原因を調べるのに少し時間が掛かりそうなので、数日ほどお時間をください m(_ _;m ところでウィンドウ右上の終了ボタンを押した後に MessageBox を出されるのは どのような理由でしょうか?
メンテ
Re: MakeKeyInput の引数で終了処理が実行されない。 ( No.4 )
名前:どぶろく 日時:2022/10/07 18:14

文字データを入力したり変更したりしたのに保存せずに終了ボタンを押した場合、 保存するかしないかの確認のメッセージを出すのに使用しています。 ちなみに仕事で使う作業日報を書くソフトです。 ゲーム以外のソフトもDXライブラリを使用して作っています。
メンテ
Re: MakeKeyInput の引数で終了処理が実行されない。 ( No.5 )
名前:管理人 日時:2022/10/08 00:27

ご返答ありがとうございます 少し調べてみたのですが、どうやら丁度教えていただいたバージョンから漢字変換候補リストの 取得に使用している TSF というAPIを使用すると、ウィンドウを閉じる処理を行った後に MessageBox を実行しても何も表示されないようです( Windows10 では表示されるので、恐らく OS のバグではないかと思います ) > 文字データを入力したり変更したりしたのに保存せずに終了ボタンを押した場合、 > 保存するかしないかの確認のメッセージを出すのに使用しています。 そのような用途でしたら、リファレンスには載っていませんが SetWindowUserCloseEnableFlag と GetWindowUserCloseFlag という関数を 使用することで解決できます // メインウインドウの終了ボタンを押した時にDXライブラリが自動的にウインドウを閉じるかどうかを設定する // int Flag : TRUE:自動的に閉じる( デフォルト ) FALSE:閉じない int SetWindowUserCloseEnableFlag( int Flag ) ; // メインウインドウの終了ボタンが押されたかどうかを取得する // int StateResetFlag : 終了ボタンが押された、という状態をリセットするかどうか( TRUE:リセットする FALSE:リセットしない ) // 戻り値:×ボタンが押されたかどうか( TRUE:終了ボタンが押された FLASE:終了ボタンは押されていない ) int GetWindowUserCloseFlag( int StateResetFlag = FALSE ) ; DxLib_Init の実行前でも後でも SetWindowUserCloseEnableFlag( FALSE ); を実行すると、終了ボタンを押してもウィンドウは閉じず、ProcessMessage() の戻り値もマイナスになりません 代わりに GetWindowUserCloseFlag() の戻り値が TRUE になりますので、自前で GetWindowUserCloseFlag() の 戻り値が TRUE だったらメインループから break で抜ける、という処理を書く必要があります ただ、この場合ウィンドウを閉じる処理が実行されないので、Windows7 でもメインループ外に記述された MessageBox も 問題なく実行されるというわけです どぶろくさんに載せていただいたプログラムを SetWindowUserCloseEnableFlag と GetWindowUserCloseFlag を 使用するように変更すると以下のようになります #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int InputHandle ; // 終了ボタンが押されても自動的にはウィンドウが閉じられないように設定する SetWindowUserCloseEnableFlag( FALSE ) ; ChangeWindowMode(TRUE); if( DxLib_Init() == -1 ) return -1 ; // キー入力ハンドルを作る(キャンセルなし全角文字有り数値入力なし) InputHandle = MakeKeyInput( 50 , FALSE , FALSE , FALSE ) ; // この引数の設定だと実行されない //InputHandle = MakeKeyInput( 50 , FALSE , TRUE , FALSE ) ; // 3番目の引数が TRUE だと実行される while( !ProcessMessage() ) { DrawString(100, 100, "インプット", GetColor(255, 255, 255)); // 終了ボタンが押されたらループを抜ける if( GetWindowUserCloseFlag( TRUE ) ) { break ; } } MessageBox(NULL, "", "", MB_OK); // ここから実行されない DeleteKeyInput( InputHandle ) ; // 用済みのインプットハンドルを削除する DxLib_End() ; return 0 ; } 尚、GetWindowUserCloseFlag の引数 StateResetFlag を TRUE にすると『終了ボタンが押された』という 状態がリセットされます( 例えば、終了ボタンを押された後に StateResetFlag を TRUE にして GetWindowUserCloseFlag を実行すると戻り値は TRUE ですが、『終了ボタンが押された』状態が リセットされるので、再度終了ボタンが押される前に GetWindowUserCloseFlag を実行した場合は 戻り値は FALSE ( 『終了ボタンが押されていない』 )になります ) 手元の Windows7 環境では上記の変更で MessageBox が正常に実行されましたので、よろしければお試しください m(_ _)m > ちなみに仕事で使う作業日報を書くソフトです。 > ゲーム以外のソフトもDXライブラリを使用して作っています。 ゲーム以外でもお役に立てているようで何よりです 私も本業でゲーム以外のツール類の作成にDXライブラリを使用しています (^ ^;
メンテ
Re: MakeKeyInput の引数で終了処理が実行されない。 ( No.6 )
名前:どぶろく(解決) 日時:2022/10/08 06:32

ありがとうございます! 無事に終了処理を実行することができました。
メンテ

Page: 1 |

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

   クッキー保存