【发布时间】:2017-12-12 08:02:15
【问题描述】:
我有这个源代码的windows应用程序
#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;
}
我需要知道系统何时关闭并阻止它,或者至少向用户发送消息。
我的应用程序似乎没有收到WM_QUERYENDSESSION 消息。
我也尝试使用ShutdownBlockReasonCreate(),但我没有HWND 作为窗口。
我应该怎么做?
【问题讨论】:
-
习惯上在尝试为它处理消息之前创建一个窗口。
-
一个“窗口过程”(或“winproc”)连接到一个窗口类。如果您没有窗口或窗口类,那么事件循环就没有什么可做的了。名为
WinProc的函数没有什么特别之处,Windows 不会自动调用它。 -
WM_QUERYENDSESSION的文档不清楚该消息是发送到所有顶级窗口(这很荒谬,但并非不可想象)还是任务消息。也就是说,如果 Microsoft 的文档是可靠的,那么可以从“由 windows proc 处理”推断它是发送到窗口的。但是文档中充满了此类技术作家的许可声明,其中大部分都是错误的(就像许多高度赞成的 SO 答案一样)。如果它是一个任务消息,那么只需将处理移至您的消息循环。但如果它被发送到顶级寡妇,然后创建一个顶级窗口。 -
您为什么要这样做?这听起来像是个坏主意™。
-
@Cheersandhth.-Alf 你大概是指 thread 消息?实际上,如果您考虑
WM_QUERYENDSESSION具有返回值这一事实,则并不清楚。 A thread message can only be posted,因此它无法将值返回给它的发送者。这只给我们留下了始终与窗口相关联的SendMessage*系列函数。