【问题标题】:Is it possible to catch the close button and minimize the window instead? AutoHotKey是否可以抓住关闭按钮并最小化窗口?自动热键
【发布时间】:2017-02-14 10:08:32
【问题描述】:

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

【问题讨论】:

标签: autohotkey


【解决方案1】:

这个 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

【讨论】:

  • 我无法理解投反对票的原因。该脚本完全按要求工作。请否决者测试脚本并说明什么不起作用。
  • 阅读您发布的文章?同样在 WM_NCHITTEST 文档中:“如果未捕获鼠标,则将消息发送到光标下方的窗口。否则,将消息发送到已捕获鼠标的窗口”。
  • 还有……那么这意味着什么是一个问题?顺便说一句,我已经对系统托盘脚本进行了最小化/最小化,多年来我一直以这种方式编写,从未遇到过问题,而其他主要的著名的最小化系统托盘实用程序和 AutoHotkey 脚本也使用 WM_NCHITTEST。
  • A WM_NCHITTEST 不一定会落在活动窗口上,如果活动窗口不在它下面,那很明显。有时您想在未聚焦的窗口上单击关闭按钮。
  • 简单:如果鼠标被捕获,您提出的 WM_NCHITTEST 解决方案将不起作用。
猜你喜欢
  • 1970-01-01
  • 2014-03-30
  • 2010-09-23
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多