如何区分"关闭所有Windows"和"关闭"使用Windows 7的MFC中的各个窗口?

时间:2014-05-01 12:58:50

标签: c++ windows-7 mfc visual-studio-2005

我正在使用带有MFC和Windows 7的Visual Studio 2005.我有一个带有许多对话框窗口的应用程序。

我使用OnSysCommand检查SC_CLOSE消息并检查lParam以确定是从任务栏启动还是从对话框上的关闭按钮启动。但是,我如何确定关闭消息是否是"关闭所有窗口"从任务栏或只是从任务栏关闭单个对话框?

由于

2 个答案:

答案 0 :(得分:2)

我认为你不会用一条信息解决这个问题。

关闭应用程序时,您还必须区分鼠标操作和Alt + F4 如果您使用Alt + F4关闭应用程序,则消息看起来完全相同,例如从任务栏关闭它(查看lParam值)

您可以查看使用GetMessage检索的最后一条消息(最后一条输入消息)。如果消息来自任务栏,则它是一个发布的WM_SYSCOMMAND。如果消息来自内部,则会收到WM_SYSCOMMAND作为SendMessage。

您可以使用AfxGetCurrentMessage来确定最后一条输入消息是什么。如果你在这里找到WM_SYSCOMMAND,则关闭来自任务栏。如果您在此处找到键盘或鼠标消息,则消息来自用户输入。

提示:使用Spy ++检查此行为。

答案 1 :(得分:0)

我认为您可以区分如下:

使用系统菜单关闭窗口'关闭'生成WM_SYSCOMMAND,其中wParam = SC_CLOSE和lParam!= 0。

使用Alt + F4或&#34关闭窗口;关闭所有窗口"两者都生成一个WM_SYSCOMMAND,其中wParam = SC_CLOSE且lParam = 0。

但是,Alt + F4会事先生成带有wParam = VK_F4的WM_SYSKEYDOWN消息。

我想忽略"关闭所有窗口",同时使用Alt + F4和'关闭'菜单。因此,我在WM_SYSKEYDOWN中捕获了Alt + F4并发布了WM_CLOSE消息。然后我忽略了任何带有wParam = SC_CLOSE和lParam = 0的WM_SYSCOMMAND消息。