代码之家  ›  专栏  ›  技术社区  ›  Andreas Rejbrand

系统命令异常

  •  1
  • Andreas Rejbrand  · 技术社区  · 15 年前

    应用程序接收 WM_SYSCOMMAND 用户选择菜单项时的消息 命令 系统 菜单,所以wparam可以是sc_close,sc_contexthelp,sc_maximize,sc_minimize,sc_restore等等,这是合乎逻辑的。(当然,您也可以通过单击最小化、最大化、关闭按钮等发送这些消息。)

    但是也可以发送wm_syscommand消息来向windows shell发送命令。例如,可以显示“开始”菜单(sc_tasklist)、激活屏幕保护程序(sc_screensave)和关闭显示器(sc_monitorpower)。这没道理,是吗?这与应用程序的系统菜单有什么关系?这更像是一个“系统命令”,即对消息的名称“wm_syscommand”的一种完全不同的解释。这就像消息被用来向系统发送命令请求一样。

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

    3 回复  |  直到 8 年前
        1
  •  2
  •   richardwb    15 年前

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

    当用户使用系统菜单或标题按钮时,这些wm_sys命令(maximize、minimize、restore、close和系统菜单中的命令)可能会发送到您的窗口。我相信(我的win32是非常生锈的)这些通常由defwindowproc处理,defwindowproc完成所有的脏工作,然后向您的窗口发送一个通知(wm-size/wm-size、wm-close等)。

    现在,再往下看(隐藏在底部的简介中):

    应用程序可以随时通过向defwindowproc传递wm_syscommand消息来执行任何系统命令。应用程序未处理的任何wm_syscommand消息都必须传递给defwindowproc。

    您还可以通过将特定的wm_syscommand发送到defwindowproc来执行它。其中包括上面提到的,但也包括额外的,如sc_screensave和sc_tasklist。我不知道像scu screensave这样的defwindowproc最终会采用什么样的路径来触发屏幕保护程序,但事实就是这样。

    所以我认为整个wm_syscommands类都是系统命令。只是其中一些(从窗口标题可以访问的)被发送到窗口,其他的则由窗口根据您的判断发送。

        2
  •  0
  •   Steve Hanov    15 年前

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

        3
  •  0
  •   ligand    8 年前

    这是16位windows的遗留问题。

    请在谷歌上搜索Bob Gunderson__getMessage和PeekMessage Internals_Microsoft Developer Network Technology Group_1992年12月11日的文章

    在windows 3.1时代,操作系统是非抢占式的、单线程的。当getMessage/peekMessage函数访问系统队列并遇到ctrl-esc键down时,wm_syscommand消息被发送到wparam中带有sc_tasklist的活动应用程序(记住它是单线程系统)。“向下键”事件指示窗口显示“任务管理器”窗口。

    推荐文章