WM_NCHITTEST 和检测窗口的标题栏

WM_NCHITTEST 和检测窗口的标题栏

我对编程世界还比较陌生。我经常使用 AutoHotkey,并遇到了使用 WM_NCHITTEST 的代码。以下代码:当鼠标光标位于窗口标题栏上方时,右键单击可最小化窗口,中键单击可关闭窗口。当鼠标光标的 X 坐标 > 0 时,一切正常(所有窗口和监视器都正确的主显示屏)。当 X < 0 时,什么都不起作用(一切都归于左边主显示屏)。有人能解释一下吗?

具体来说,“WM_NCHITTEST,, x | (y << 16)”,不太明白。

原始代码链接:https://www.autohotkey.com/boards/viewtopic.php?f=76&t=63022&p=269207&hilit=titlebar+middle+click#p269207

链接到 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 消息,使用0x84for Msg。请参阅消息列表

static WM_NCHITTEST := 0x84
SendMessage, WM_NCHITTEST, wParam, lParam, Control, WinTitle

lParam现在 WM_NCHITTEST 消息需要这样的光标坐标

参数

低位字指定光标的 x 坐标。该坐标相对于屏幕的左上角。

高位字指定光标的 y 坐标。该坐标相对于屏幕的左上角。

基本上,x | (y << 16)这是一种根据需要将两个变量合并为一个变量的方法。请参阅高位字、低位字C 中的按位运算

现在,我们不再直接使用xy作为整数,而是需要处理负值。请使用有符号的 16 位值(短整型)。

SendMessage, WM_NCHITTEST,, (x & 0xFFFF) | ((y & 0xFFFF) << 16),, ahk_id %w%

相关内容