私は、システムがシャットダウンされたときに知っていて、それを防ぐ、あるいは少なくともユーザーにメッセージを送信する必要があり、このソースコードウィンドウを使用せずにシステムをシャットダウンする方法を教えてください。
#include <Windows.h>
#include <thread>
#include <chrono>
int WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int cmdShow)
{
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WinProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
switch (Message)
{
case WM_QUERYENDSESSION:
MessageBox(NULL, "Triggered?", "Message", 0);
AbortSystemShutdown(NULL);
return 0;
default:
return DefWindowProc(hWnd, Message, wParam, lParam);
}
return 0;
}
でWindowsアプリケーションを持っています。
私のアプリケーションがWM_QUERYENDSESSION
メッセージを受信しているようではありません。
私もShutdownBlockReasonCreate()
を使用しようとしましたが、ウィンドウにはHWND
がありません。
私はこれをどのようにしたらよいでしょうか?
メッセージを処理しようとする前にウィンドウを作成するのが普通です。 –
"ウィンドウプロシージャ"(または "winproc")がウィンドウクラスに接続されています。ウィンドウやウィンドウクラスがない場合は、イベントループが実際に行うことはありません。 'WinProc'という名前の関数に特別なものは何もないので、Windowsはそれを自動的に呼び出さない。 –
'WM_QUERYENDSESSION'のドキュメントは、このメッセージがすべての最上位レベルのウィンドウに送信されるかどうかは不明です(それは不合理ですが考えられないことではありません)か、タスクメッセージです。つまり、マイクロソフトの文書が信頼できるものであれば、 "windows procによって処理された"ことから、ウィンドウに送信されたことを推測することができます。しかし、そのようなハイテクライターのライセンスに関する記述はドキュメントに完全に含まれていますが、そのほとんどは非常に間違っています(多くの高度に上書きされたSOの回答のように)。タスクmessqageの場合は、メッセージループに処理を移してください。しかし、トップレベルウィジェットに送信された場合は、最上位ウィンドウを作成します。 –