トップページ > 記事閲覧
SetSysCommandOffFlag使って、ステップ実行するとキーボード入力が重い
名前:スケープゴート 日時: 2024/05/13 23:58

管理人さん、いつもお世話になっております。 題名通りに、SetSysCommandOffFlagをTRUEにして、ステップ実行すると、キーボード入力が激重くなります。 最初はデバッグのステップ実行だと思いましたが、試しにAlt+Tab押したり、notepadでなんか入力したりしたら、デバッグだけじゃないことをわかりました。 再現できる簡単なプログラムは以下です: #include <DxLib.h> int WINAPI WinMain(_In_ HINSTANCE _hInstance, _In_opt_ HINSTANCE _hPrevInstance, _In_ LPSTR _sCmdLine, _In_ int _iShowCmd) { UNREFERENCED_PARAMETER(_hInstance); UNREFERENCED_PARAMETER(_hPrevInstance); UNREFERENCED_PARAMETER(_sCmdLine); UNREFERENCED_PARAMETER(_iShowCmd); ChangeWindowMode(TRUE); DxLib_Init(); SetSysCommandOffFlag(TRUE); for (int i = 0; i < 100; ++i) { DrawFormatString(0, 0, GetColor(255, 255, 255), "Test"); } DxLib_End(); }
メンテ

Page: 1 |

Re: SetSysCommandOffFlag使って、ステップ実行するとキーボード入力が重い ( No.1 )
名前:スケープゴート 日時:2024/05/14 00:06

試しにSetHookWinProcで各キー関連のメッセージを無視しようとしましたが、 おそらくDxLib内部でもメッセージを処理しているため、AltとF10による一時停止を防げませんでした。 下記の例で文字は移動するので、AltやF10を押すと処理が止まることはわかりやすいです。 #include <DxLib.h> LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(_In_ HINSTANCE _hInstance, _In_opt_ HINSTANCE _hPrevInstance, _In_ LPSTR _sCmdLine, _In_ int _iShowCmd) { UNREFERENCED_PARAMETER(_hInstance); UNREFERENCED_PARAMETER(_hPrevInstance); UNREFERENCED_PARAMETER(_sCmdLine); UNREFERENCED_PARAMETER(_iShowCmd); ChangeWindowMode(TRUE); SetGraphMode(800, 600, 32); SetHookWinProc(WndProc); DxLib_Init(); SetDrawScreen(DX_SCREEN_BACK); int xPos = 0; // 文字のx座標. bool bReverseDirection = false; // 文字の移動方向を反転するか. while (true) { // テスト用の文字を描画する. DrawFormatString(xPos, 0, GetColor(255, 255, 255), "Test"); // ウィンドゥサイズを越えたら方向を反転する. if (bReverseDirection) { xPos -= 20; if (xPos <= 0) { bReverseDirection = !bReverseDirection; } } else { xPos += 20; if (xPos >= 800) { bReverseDirection = !bReverseDirection; } } if (ScreenFlip() != 0 || ProcessMessage() != 0 || ClearDrawScreen() != 0) { break; } } DxLib_End(); return 0; } LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(hWnd); UNREFERENCED_PARAMETER(msg); UNREFERENCED_PARAMETER(wParam); UNREFERENCED_PARAMETER(lParam); switch (msg) { case WM_SYSKEYDOWN: case WM_SYSKEYUP: case WM_KEYDOWN: case WM_KEYUP: case WM_IME_KEYDOWN: case WM_IME_KEYUP: if ((wParam == VK_MENU) || wParam == VK_F10) { // AltとF10を無視する. return 0; } break; default: break; } return 0; }
メンテ
Re: SetSysCommandOffFlag使って、ステップ実行するとキーボード入力が重い ( No.2 )
名前:管理人 日時:2024/05/15 03:08

> 題名通りに、SetSysCommandOffFlagをTRUEにして、ステップ実行すると、キーボード入力が激重くなります。 載せていただいたプログラムを実行してみましたが、私の環境ではキーボード入力が激重になることはありませんでした 私も別の処理( DirectInput の排他モードを使用する )ですが、実行するとキーボード入力が激重になるなど 今まで何度かキーボード入力が激重になる現象に遭遇したことがあるのですが、いつの間にかその現象が 発生しなくなったり、Windows Update の後に発生しなくなったり、逆に Windows Update の後から発生するように なったりと色々でしたが、何れも原因は分かりませんでした… > 試しにSetHookWinProcで各キー関連のメッセージを無視しようとしましたが、 > おそらくDxLib内部でもメッセージを処理しているため、AltとF10による一時停止を防げませんでした。 > 下記の例で文字は移動するので、AltやF10を押すと処理が止まることはわかりやすいです。 DXライブラリ内部で行っているメッセージ処理を実行したくない場合は、Hook で実行している プロージャの中で SetUseHookWinProcReturnValue( TRUE ); を実行するとDXライブラリ内部の メッセージ処理をキャンセルすることができます 試しに載せていただいたプログラムのこちらの部分に switch (msg) { case WM_SYSKEYDOWN: case WM_SYSKEYUP: case WM_KEYDOWN: case WM_KEYUP: case WM_IME_KEYDOWN: case WM_IME_KEYUP: if ((wParam == VK_MENU) || wParam == VK_F10) { // AltとF10を無視する. return 0; } break; default: break; } SetUseHookWinProcReturnValue( TRUE ); を差し込んで以下のようにしてみたところ switch (msg) { case WM_SYSKEYDOWN: case WM_SYSKEYUP: case WM_KEYDOWN: case WM_KEYUP: case WM_IME_KEYDOWN: case WM_IME_KEYUP: if ((wParam == VK_MENU) || wParam == VK_F10) { SetUseHookWinProcReturnValue( TRUE ); // AltとF10を無視する. return 0; } break; default: break; } F10 と Alt キーを押しても一時停止しないようになりました よろしければお試しください m(_ _)m
メンテ
Re: SetSysCommandOffFlag使って、ステップ実行するとキーボード入力が重い ( No.3 )
名前:スケープゴート 日時:2024/05/15 23:37

管理人さん ありがとうございます! SetUseHookWinProcReturnValue関数の存在を完全に気づきませんでした(汗) これでAltとF10がプログラムを一時停止せず、ブレイクポイント・ステップ実行時にキーボード入力が重くならないことを確認できました。
メンテ

Page: 1 |

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

   クッキー保存