質問: `ShutdownBlockReasonCreate()` を呼び出し `WM_QUERYENDSESSION` に `FALSE` を返すことでシャットダウンをブロックすることができますが、シャットダウンをキャンセルすると、ブロックしたアプリケーションでIMEの未確定文字列が表示されなくなってしまいました。 !画像の説明をここに入力 Win7 のマシンでは再現しなかったので、8(.1) で仕様が変わったのかなと考えています。 アプリケーションを起動しなおせば直るのですが、この挙動を回避する方法はあるのでしょうか? ``` // スクリーンショットに使ったサンプルコード // VisualStudio の Win32 Project から以下のように変更した LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CREATE: CreateWindow( _T("EDIT"), _T("hoge"), WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT, 0, 0, 600, 400, hWnd, NULL, hInst, NULL ); break; case WM_QUERYENDSESSION: ShutdownBlockReasonCreate(hWnd, _T("test")); return FALSE; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } ```
回答: もしそのソフトでしか起きない事象であるなら関係ないかもしれませんので参考程度に。 実際には確認していませんが、恐らく先に何らかのIME関連のプロセスが終了してしまったのではないでしょうか。 `SetProcessShutdownParameters`でシャットダウンの通知の優先順位を上げてみてはいかがでしょう。 ただし対象のプロセスが同様に優先順位を上げている場合、確実に先に通知を受け取る保証はできません。