申请收回 wm_syscommand 用户选择菜单项时的消息 命令系统 菜单,因此可以是sc_close,sc_contexthelp,sc_maximize,sc_minimize,sc_restore等。这是合乎逻辑的。 (当然,您还可以通过单击最小化,最大化,关闭按钮等来发送这些消息。)

但是,也可以将WM_SYSCOMMAND消息发送到Windows Shell。例如,一个人可以显示“开始”菜单(SC_TASKLIST),激活屏幕保护程序(SC_SCREENSAVE),然后关闭监视器(SC_Monitorpower)。这没有道理,是吗?这与应用程序的系统菜单有什么关系?这更像是一个“系统命令”,即对消息的“ wm_syscommand”的名称完全解释。就像该消息用于将命令请求发送到系统一样。

为什么将此消息用于两个看似完全不同的东西,而“ syscommand”的名称是什么意思(在系统菜单上的命令或操作系统的命令)?

有帮助吗?

解决方案

当用户从窗口菜单(以前称为系统或控制菜单)或用户选择最大化按钮,最小化按钮,还原按钮或关闭按钮时,窗口会收到此消息。

当用户使用系统菜单或字幕按钮时,这些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的整个类是系统命令。只是其中一些(可以从窗口的标题中访问的内容)被发送到窗口,而另一些则由窗口自行决定发送。

其他提示

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

这是16位Windows的遗产。

请Google Google Bob Gunderson的文章:《 GetMessage和Peekmessage Internals》,Microsoft开发人员网络技术集团,1992年12月11日

在Windows 3.1期间,操作系统是非抢先和单线程的。当GetMessage/PeekMessage函数访问系统队列并遇到CTRL-ESC密钥时,WM_SYSCOMMAND消息已将其发布到Active应用程序(请记住,这是一个单线线程系统),使用sc_taskList在WPARAM中。关键的事件是指示窗口显示“任务管理器”窗口。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top