据the WM_QUERYENDSESSION docs,“应用程序应该尊重用户的意图,并返回TRUE。” This link将其归纳为“[在XP中]应用程序可以返回TRUE以表示它们可以关闭,或者FALSE以表示它们不应该关闭”。WM_QUERYENDSESSION处理程序的返回值不具有预期效果
然而,在我自己的应用程序,它似乎像相反正在发生的事情:
当我返回FALSE,所有正在运行的应用程序就会被终止,并在计算机重新启动(当我的应用程序获取
WM_ENDSESSION
消息,wParam
被设置为1,指示“系统被关闭或重新启动”(见WM_ENDSESSION docs))。当我返回TRUE,一些正在运行的应用程序就会被终止,但是当它到达我的应用程序,它似乎停止停机处理,并随后
WM_ENDSESSION
消息有wParam
设置为0,因为如果闭塞下来被中止,我的应用程序仍然打开。还要注意,因为DefWindowProc
“对于[WM_QUERYENDSESSION]”返回TRUE,所以使用它也会以相同的方式阻塞关闭。
如果我完全删除的WM_QUERYENDSESSION
全部处理,则整个关停业务经历为正常,结束我的应用程序和关闭。这可能表明在我的应用程序中出现了严重错误,因为我认为这会导致与使用DefWindowProc
相同的行为。我已经观察到这种行为,即使我将我的处理程序仅削减为返回语句,或者使用TRUE或FALSE,或者将消息和参数传递给DefWindowProc
。
因为我不想停止关闭,并几乎只处理它,我就可以登录,当它发生,我可以删除它的所有操作,并有事情表现得所需。当然,这并不解释为什么这似乎完全与文档相矛盾,所以我想知道是否有人有想法。
这一切会倒在Windows XP中,所以为Vista +后续的变化是不相关的。
碰巧你是一个对话框?从对话框过程返回“TRUE”不同于从窗口过程返回“TRUE”。 –
我提出了一堆抽象,然后马上忘记了基础;是的,这是一个对话框,使用'SetWindowLong'设置真正的返回类型使一切恢复正常。 –