是否可以捕捉关闭按钮并最小化窗口? AutoHotkey的

时间:2016-10-05 20:10:11

标签: autohotkey

我希望只有右键单击任务栏图标并选择关闭才能关闭计算机中的所有程序。因此,当我单击任何窗口上的X按钮时,它应该转换为最小化。如何使用AutoHotKey实现此目的?

1 个答案:

答案 0 :(得分:3)

此AutoHotkey脚本应该可以实现您所需的功能。注意:如果启用了航空模式,则代码可能无法正常工作。

  • MouseGetPos获取光标下窗口的hWnd
  • WM_NCHITTEST获取有关光标下项目类型的信息,需要一些繁琐的数学运算才能将坐标组合成一个4字节的结构。

困难的是,每次使用鼠标时,此脚本都会捕获每个鼠标左键,但不得干扰鼠标的正常运行。按下鼠标按钮时,不会发送任何按键,按下该按键。在光标下方的窗口上进行检查。如果找到关闭按钮,则该窗口最小化,我们实际上从未发送过鼠标按钮。如果没有找到关闭按钮,我们将模拟鼠标的正常功能:发送向下按,直到检测到鼠标按钮已被释放,并发送鼠标释放。我使用“按”这个词,因为它比“点击”或“保持”更清晰,这意味着快速/长时间。

这个解决方案实际上非常简单,但是这个问题给我带来了很多麻烦,几年前我第一次调查并测试了不同的方法。我从来没有让鼠标功能受到损害,但我不能保证,没有一些软件无法正常工作,或者工作不正常。

如果某些程序没有为关闭按钮返回标准NCHITTEST值,我相信Winamp 2.5e和以前版本的Mozilla Firefox都是如此,那么解决方法是检查类/ exe如果光标相对于窗口的位置与关闭按钮一致,则计算出程序。

顺便说一句,我对我计划在未来几个月内发布的'minimiser'脚本使用了相同的原则,如果你右键单击最小化按钮,它会最小化系统托盘的窗口。

;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