2010-05-02 88 views
1

申请临危的WM_SYSCOMMAND消息当用户在系统菜单上选择一个菜单项命令等的wParam可以SC_CLOSE,SC_CONTEXTHELP,SC_MAXIMIZE,SC_MINIMIZE,SC_RESTORE等等。这是符合逻辑的。 (当然,你也可以通过点击最小化,最大化,关闭按钮等来发送这些消息)。WM_SYSCOMMAND古怪

但是也可以发送WM_SYSCOMMAND消息来发送命令到Windows Shell。例如,可以显示开始菜单(SC_TASKLIST),激活屏幕保护程序(SC_SCREENSAVE),然后关闭显示器(SC_MONITORPOWER)。这没有意义,是吗?这与应用程序的系统菜单有什么关系?这更多的是“系统命令”,即更多的是对消息名称“WM_SYSCOMMAND”的完全其他解释。就像这条消息用于向系统发送命令请求。

为什么此消息用于两个看起来完全不同的事情,名称“SYSCOMMAND”指的是什么(系统菜单上的命令或操作系统的命令)?

+0

这确实是一个语义问题,如果这是微软决定合理的逻辑,那么他们实现了。 – 2010-05-02 22:56:23

回答

2

一个窗口当用户选择从窗口菜单的命令(前身为系统或控制菜单)时,或者当用户选择最大化按钮,最小化按钮,恢复按钮,或关闭按钮接收到该消息。

当用户使用系统菜单或标题按钮时,这些WM_SYSCOMMANDs(最大化,最小化,还原,关闭和系统菜单中的那些)可能会发送到您的窗口。我相信(我的Win32非常生锈),这些通常由DefWindowProc处理,它执行所有肮脏的工作,然后向您的窗口发送通知(WM_SIZE/WM_SIZING,WM_CLOSE等)。

现在,进一步向下(在底部隐藏在导语):

一个应用程序可以通过使WM_SYSCOMMAND消息DefWindowProc函数随时进行任何系统命令。任何未由应用程序处理的WM_SYSCOMMAND消息都必须传递给DefWindowProc。

您也可以通过将它发送到DefWindowProc来执行特定的WM_SYSCOMMAND。这些包括上面提到的那些,但是它们还包括附加的诸如SC_SCREENSAVE和SC_TASKLIST。我不知道通过DefWindowProc有什么样的路径,像SC_SCREENSAVE最终会触发屏幕保护程序,但事实就是如此。

所以我看到的方式是整个类的WM_SYSCOMMANDs是系统命令。只是它们中的一些(可从窗口标题访问的)被发送到窗口,其他窗口则由您自行决定发送。

1

WM_SYSCOMMAND只是WM_COMMAND的系统版本,它遵循相同的语义。当用户从菜单中选择一个项目,单击一个按钮,选择一个单选按钮等时,WM_COMMAND消息就会发送到您的应用程序.ID参数指示被点击的内容。该命令也可以使用SendMessage()或PostMessage()手动发送。

0

这是16位Windows的遗留问题。

请谷歌的文章鲍勃·冈德森:“的GetMessage和的PeekMessage内幕”,Microsoft开发人员网络技术组,1992年12月11日

在Windows 3期。1,操作系统是非抢先式和单线程的。当GetMessage/PeekMessage函数访问系统队列并遇到CTRL-ESC键时,WM_SYSCOMMAND消息被发送到wParam中的SC_TASKLIST的活动应用程序(记住它是单线程系统)。关键事件是指示Windows显示任务管理器窗口。