2

所以我正在尝试创建一个在按住鼠标中键的同时左右滚动的脚本。但是,无论是否按住鼠标中键,左右滚动都会滚动。它总是执行。我需要帮助来解决这个问题。

(我确实注意到第 21 行有太多空间,请忽略)代码:

; Hold the scroll wheel and scroll to scroll horizontally
; Scroll up = left, scroll down = right

#NoEnv
;#InstallMouseHook

#HotkeyInterval 1
#MaxHotkeysPerInterval 1000000 ; Prevents the popup when scrolling too fast

GetKeyState, ScrollState, MButton

if(ScrollState = U)
{
        ;return
}
else if(ScrollState = D)
{
        WheelUp::Send {WheelLeft}
        return

        WheelDown::     Send {WheelRight}
        return
}
return
4

2 回答 2

3

此方法保留所有正常的中间单击功能,但state在按下时仅切换变量。每当使用 Wheelup 或 Wheeldown 时,都会检查此变量。

~Mbutton::
    state := 1
Return

~Mbutton up::
    state := 0
Return

WheelUp:: Send % (state) ? "{WheelLeft}" : "{WheelUp}"
WheelDown:: Send % (state) ? "{WheelRight}" : "{WheelDown}"

/*
The ternary operators are short for:
If state = 1
    Send {WheelLeft}
else
    Send {WheelUp}
*/
于 2013-04-28T07:26:22.440 回答
1

双冒号定义的热键不受常规if语句控制。要使热键上下文敏感,您需要使用#If(or #IfWinActiveor #IfWinExist)。文档中的一个示例(上下文相关热键部分):

#If MouseIsOver("ahk_class Shell_TrayWnd")
WheelUp::Send {Volume_Up}     ; Wheel over taskbar: increase/decrease volume.
WheelDown::Send {Volume_Down} ; 

您还可以将常规if逻辑放入热键中(这是热键提示和备注部分的示例):

Joy2::
if not GetKeyState("Control")  ; Neither the left nor right Control key is down.
    return  ; i.e. Do nothing.
MsgBox You pressed the first joystick's second button while holding down the Control key.
return

上下文敏感通过#If旨在控制您的热键在哪个应用程序中处于活动状态。if热键定义中的常规逻辑适用于任意条件。您尝试做的事情适合后者。

在许多情况下,两者都做很有用。例如,如果您希望您的左/右行为仅在浏览器中而不是在 Microsoft Word 中,您将使用#If将热键活动限制在浏览器中,然后if GetKeyState(...)在热键定义中检查是否按下了滚动按钮。

于 2013-04-28T19:46:26.967 回答