我试图了解 Windows 应用程序是如何工作的。
有一个WndProc函数,其中发生消息处理。
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg) {
case WM_KEYDOWN:
if (wParam == VK_ESCAPE) {
if (MessageBox(0, L"Are you sure?", L"Exit?", MB_YESNO | MB_ICONQUESTION) == IDYES)
//Release the windows allocated memory
DestroyWindow(hwnd);
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
该函数可以在两种情况下调用:
A) 在消息循环周期中由 DispatchMessage(&msg) 函数调用:
while (true){
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
if (msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
B) 当接收到非排队消息时由 Windows 调用。
这是如何运作的? Windows 如何在不使用并行性的情况下立即调用 WndProc 函数?您能详细描述一下函数调用的机制吗?
MSDN 官方文档说:
非排队消息绕过系统消息队列和线程消息队列,立即发送到目标窗口过程。系统通常发送非排队消息来通知窗口影响它的事件。例如,当用户激活一个新的应用程序窗口时,系统向该窗口发送一系列消息,包括WM_ACTIVATE、WM_SETFOCUS和WM_SETCURSOR。这些消息通知窗口它已被激活,键盘输入正在定向到窗口,并且鼠标光标已在窗口边框内移动。当应用程序调用某些系统函数时,也会产生非排队消息。例如,应用程序使用SetWindowPos函数移动窗口后,系统会发送WM_WINDOWPOSCHANGED消息。
原来非排队消息只在窗口初始化时出现,而后续的所有非排队消息只能是我程序中调用WinAPI函数的结果?