【发布时间】:2017-02-14 10:08:32
【问题描述】:
我希望仅通过右键单击任务栏图标并选择关闭来关闭计算机中的所有程序。因此,当我单击任何窗口上的 X 按钮时,它应该转换为最小化。如何使用 AutoHotKey 实现这一点?
【问题讨论】:
-
如果只需要检测关闭事件,那么脚本会更简单。 How to minimize a window by closing it?
标签: autohotkey
我希望仅通过右键单击任务栏图标并选择关闭来关闭计算机中的所有程序。因此,当我单击任何窗口上的 X 按钮时,它应该转换为最小化。如何使用 AutoHotKey 实现这一点?
【问题讨论】:
标签: autohotkey
这个 AutoHotkey 脚本应该可以实现您所寻找的。注意:如果航空模式开启,代码可能无法正常工作。
MouseGetPos 获取光标所在窗口的hWnd。WM_NCHITTEST 获取有关光标下项目类型的信息,需要进行一些复杂的数学运算才能将坐标组合成一个 4 字节结构。难点在于每次你使用鼠标时,这个脚本会捕捉每一次鼠标左键的按下,但不能干扰鼠标的正常工作。按下鼠标按钮时,不发送任何按下,按下被抑制。检查光标下方的窗口。如果找到关闭按钮,则该窗口将被最小化,并且我们从未真正发送鼠标按下。如果没有找到关闭按钮,我们模拟鼠标的正常功能:发送向下按下,直到检测到鼠标按钮已被释放,然后发送鼠标释放。我使用“按下”这个词,因为它比“点击”或“按住”更清晰,意味着快速/长时间。
这个解决方案其实很简单,但是这个问题给我带来了很多麻烦,几年前我第一次研究它并测试了不同的方法。我从来没有遇到过鼠标功能受损的情况,但我不能保证,没有一些软件无法运行或无法正常运行。
如果某些程序没有为关闭按钮返回标准的NCHITTEST 值,我相信 Winamp 2.5e 和以前版本的 Mozilla Firefox 都是如此,那么解决方法是检查程序,判断光标下相对于窗口的位置是否与关闭按钮一致。
顺便说一句,我计划在未来几个月内发布的“最小化”脚本使用相同的原则,如果您右键单击最小化按钮,它会将窗口最小化到系统托盘。
;tested on Windows 7
;note: may not work correctly if aero mode is on
;note: some programs don't return the standard NCHITTEST value for a close button,
;a workaround is to compare the cursor position against the window coordinates
LButton::
CoordMode, Mouse, Screen
MouseGetPos, vPosX, vPosY, hWnd
WinGetClass, vWinClass, ahk_id %hWnd%
if vWinClass not in BaseBar,#32768,Shell_TrayWnd,WorkerW,Progman,DV2ControlHost
{
SendMessage, 0x84, 0, vPosX|(vPosY<<16), , ahk_id %hWnd% ;WM_NCHITTEST
vNCHITTEST := ErrorLevel ;(8 min, 9 max, 20 close)
;ToolTip %vNCHITTEST%
if (vNCHITTEST = 20)
{
WinMinimize, ahk_id %hWnd%
Return
}
}
SendInput {LButton Down}
KeyWait, LButton
SendInput {LButton Up}
Return
【讨论】: