2012-06-01 26 views
1

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 +后续的变化是不相关的。

+3

碰巧你是一个对话框?从对话框过程返回“TRUE”不同于从窗口过程返回“TRUE”。 –

+0

我提出了一堆抽象,然后马上忘记了基础;是的,这是一个对话框,使用'SetWindowLong'设置真正的返回类型使一切恢复正常。 –

回答

3

貌似我忘了有关这个键位:我是用对话框模板我的窗户,所以他们被用的对话框所有饰物处理。正如在DialogProc docs看出,“如果对话框过程处理,需要一个特定的返回值的消息,对话框过程应该调用SetWindowLonghwndDlgDWL_MSGRESULTLRESULT)在紧接之前设定所需的返回值返回TRUE“。

我的问题的来源可能与地解释说:“如果对话框过程返回FALSE,对话管理响应消息,执行默认对话框操作”,即返回FALSE导致默认行为,这是返回TRUE并且不阻止关机。

还需要注意的是:“虽然对话框过程类似于窗口过程,但它不得调用DefWindowProc函数来处理不需要的消息。不需要的消息由对话框窗口过程在内部处理。所以我几乎全都错了。