像往常一样,我遇到了一个非常奇怪的问题。
事实上,我不太确定问题究竟是什么,但我确定症状是什么。 该应用程序正在接收消息,处理消息和调用API,但无济于事,除非在一些特殊情况下。
我正试图抓住一个按键,即逃生键。当应用程序收到它时,它会调用PostQuitMessage()
并稍后完成处理(清理)。
问题是,当调用PostQuitMessage()
时,没有任何反应。
窗口仍然坐在那里,我认为API失败(但它返回无效,所以我无法分辨)因为我在Spy ++上看不到任何引用WM_QUIT
,WM_CLOSE
之类的内容。
导致窗口关闭的因素包括单击关闭按钮[x]或从非客户区域或标题栏拖动窗口,而不是按下escape。只需点击窗口,“alt-tabbing?”尽管正在处理这些消息,但是在窗口中,我能想到的一切都不允许窗口响应。
我将在下面发布相关代码。如果有人有任何要求,建议或解决方案,欢迎他们!感谢您的时间,祝您有个美好的一天。
这是窗口程序;它的地址以与this文章中描述的方法类似的方式存储在GWLP_USERDATA
中。我之前在其他应用程序中使用过这个问题并且从未遇到过这个问题,收到的句柄是有效的 - 该函数不起作用!?
LONG_PTR MainWindow::HandleMessage(UINT Message,
WPARAM WParam, LPARAM LParam) {
switch(CurrentState) {
case Introduction:
return HandleIntroMessage(Message, WParam, LParam);
default:
return DefWindowProc(Window(), Message, WParam, LParam);
}
}
LONG_PTR MainWindow::HandleIntroMessage(UINT Message,
WPARAM WParam, LPARAM LParam) {
switch(Message) {
case WM_KEYDOWN:
switch (WParam) {
case VK_ESCAPE:
PostQuitMessage(0);
return false;
}
case WM_DESTROY:
PostQuitMessage(0);
default:
return DefWindowProc(Window(), Message, WParam, LParam);
}
}
wWinMain()
的身体的一部分。
std::unique_ptr<ApplicationMutex> EnsureOneInstance(new ApplicationMutex);
/*
* If the instance is not first, return with the return value of the API
* SetForegroundWindow after trying to find the window.
*/
if(!EnsureOneInstance->IsInstanceFirst(L"SDV") ) {
(SetForegroundWindow(FindWindow(nullptr, L"SDV") ) );
return 1;
}
/*
* Create and show our main window; initialize the frame.
*/
std::unique_ptr<MainWindow> MainWin(new MainWindow() );
MainWin->SwitchState(Introduction);
MainWin->CreateWindowWithUserFormat();
ShowWindow(MainWin->Window(), SW_SHOWNORMAL);
SetActiveWindow(MainWin->Window() );
SetFocus(MainWin->Window() );
assert(MainWin->Window() != nullptr);
std::unique_ptr<ApplicationEngine> SDV(new ApplicationEngine(MainWin->Window(),
ThisInstance, CmdLine, CmdShow) );
SDV->Initialize();
MSG Message;
int Res = 1;
while(Res = GetMessage(&Message, MainWin->Window(), 0, 0) > 0) {
TranslateMessage(&Message);
DispatchMessage(&Message);
}
if(Res == -1) {
return GetLastError();
}
再次感谢您的时间。
答案 0 :(得分:4)
在GetMessage
通话中,您只处理MainWin->Window()
的消息,但PostQuitMessage
发布未绑定到任何特定窗口的线程消息。因此,GetMessage
永远不会检索它。您应该为第二个参数而不是窗口句柄传递NULL。
(此外,由于运算符优先级,您有一个逻辑错误 - Res
只会是1或0,而不是-1,尽管这对您的问题不负责任。)