![WM_NCHITTEST 和检测窗口的标题栏](https://linux22.com/image/1612657/WM_NCHITTEST%20%E5%92%8C%E6%A3%80%E6%B5%8B%E7%AA%97%E5%8F%A3%E7%9A%84%E6%A0%87%E9%A2%98%E6%A0%8F.png)
我对编程世界还比较陌生。我经常使用 AutoHotkey,并遇到了使用 WM_NCHITTEST 的代码。以下代码:当鼠标光标位于窗口标题栏上方时,右键单击可最小化窗口,中键单击可关闭窗口。当鼠标光标的 X 坐标 > 0 时,一切正常(所有窗口和监视器都正确的主显示屏)。当 X < 0 时,什么都不起作用(一切都归于左边主显示屏)。有人能解释一下吗?
具体来说,“WM_NCHITTEST,, x | (y << 16)”,不太明白。
链接到 WM_NCHITTEST 的 Windows 文档:https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-nchittest
#If MouseIsOverTitlebar()
RButton::SendMessage 0x112, 0xF020
MButton::WinClose
MouseIsOverTitlebar() {
static WM_NCHITTEST := 0x84, HTCAPTION := 2
CoordMode Mouse, Screen
MouseGetPos x, y, w
if WinExist("ahk_class Shell_TrayWnd ahk_id " w) ; Exclude taskbar.
return false
SendMessage WM_NCHITTEST,, x | (y << 16),, ahk_id %w%
WinExist("ahk_id " w) ; Set Last Found Window for convenience.
return ErrorLevel = HTCAPTION
}
答案1
SendMessage, Msg, wParam, lParam, Control, WinTitle
这是来自 AHK 的发送消息命令。请参阅SendMessage 教程和发信息。
为一个WM_NCHITTEST 消息,使用0x84
for Msg
。请参阅消息列表。
static WM_NCHITTEST := 0x84
SendMessage, WM_NCHITTEST, wParam, lParam, Control, WinTitle
lParam
现在 WM_NCHITTEST 消息需要这样的光标坐标
参数
低位字指定光标的 x 坐标。该坐标相对于屏幕的左上角。
高位字指定光标的 y 坐标。该坐标相对于屏幕的左上角。
基本上,x | (y << 16)
这是一种根据需要将两个变量合并为一个变量的方法。请参阅高位字、低位字和C 中的按位运算。
现在,我们不再直接使用x
和y
作为整数,而是需要处理负值。请使用有符号的 16 位值(短整型)。
SendMessage, WM_NCHITTEST,, (x & 0xFFFF) | ((y & 0xFFFF) << 16),, ahk_id %w%