AHK:仅为一个特定的活动窗口分配热键,而不为其他窗口分配热键

时间:2016-03-22 15:04:03

标签: autohotkey

我刚刚完成了一段执行以下操作的代码。当我在Firefox或EndNote中通过鼠标进行选择时,脚本会按Ctrl + c并检查剪贴板以进行正则表达式匹配。如果匹配,则更改剪贴板内容并显示工具提示。它适用于这两个程序。发送Ctrl + c时,Adobe Acrobat有时会显示错误(即使用户按下ctrl-c Acrobat有时会显示着名"复制到剪贴板时出错。发生内部错误)。所以它决定分配一个F9热键,但它适用于所有程序而不仅仅适用于Acrobat。如何仅为一个窗口分配热键 - Acrobat?这是我的代码。我知道它很蹩脚 - 我是编程的新手,尤其是AHK。

#If WinActive("ahk_exe firefox.exe") || WinActive("ahk_exe EndNote.exe") || WinActive("ahk_exe Acrobat.exe")
        if WinActive("ahk_exe Acrobat.exe")
        F9::
        {
        Clipboard:=""
        send,^c
        ClipWait, 1
        ToolTip % Clipboard := RegExReplace(Clipboard, "\r\n", " ")
        SetTimer, ToolTipOff, -1000
        }
        return

    ~LButton::
        now := A_TickCount
        while GetKeyState("LButton", "P")
            continue
        if (A_TickCount-now > 500 )
        {   
            Send ^c
            if WinActive("ahk_exe firefox.exe")
            {
                If RegExMatch(Clipboard, "[0-9]\.\s[A-Za-z,]*\s[A-Za-z]*")
                {
                regex := "[0-9]\.\s*|\s?\([^)]*\)|\."
                replace := ""
                }
                else If RegExMatch(Clipboard,"[0-9]{2}[-\/][0-9]{2}[-\/][0-9]{4}")
                {
                Clipboard := RegExReplace(Clipboard, "^0", "")
                regex := "\/"
                replace := "."
                }
                else return
            }
            else if WinActive("ahk_exe EndNote.exe")
            {
                If RegExMatch(Clipboard, "[a-z]+\,\s[A-Z0-9‘“]")
                {
                regex := "\??!?\:|\?|!"
                replace := "."
                }
                else return
                }
            ToolTip % Clipboard := RegExReplace(Clipboard, regex, replace)
            SetTimer, ToolTipOff, -1000
        }
    return
#If

ToolTipOff:
    ToolTip
return

1 个答案:

答案 0 :(得分:1)

我在前几行看到了一些非常基本的问题。让我解释一下...... AutoHotkey If#If中有两种类型的if语句。 您通常总是使用正常的If - 语句,除非您使用热键执行某些操作,并且您希望特定的热键具有上下文相关性。
以下是一些重要规则:
正常If - 语句必须使用花括号{}来标记表达式为真时应执行的代码区域。如果你不使用花括号,那么If - 语句就像你在If语句下直接在第一个命令周围放置花括号一样。 示例:

If WinActive("Firefox") {
    Send, Test
    MsgBox, The script just typed "Test.
}

另一个例子:

If WinActive("Firefox")
    MsgBox, Firefox is the active window.

正常If - 语句不能在热键定义周围使用,而只能在其中使用。

这是允许的:

F1::
    If (A_OSVersion = "WIN_7") {
        MsgBox, Your operating system is Windows 7 and you just pressed F1.
    }
Return

这不是:

If (A_OSVersion = "WIN_7") {
    F1::
        MsgBox, Your operating system is Windows 7 and you just pressed F1.
    Return
}

但是有一种解决方法,那就是#If - 陈述 #If - 陈述永远不会使用大括号 它们只能用于热键定义 而且他们只能通过另一个#If声明结束 (简单地使用空#If来关闭它是很常见的。)

示例:

#If (A_OSVersion = "WIN_7")
    F1::
        MsgBox, Your operating system is Windows 7 and you just pressed F1.
    Return
#If

一个更复杂的例子:

#If (A_ScreenWidth >= 1920)
    F1::
        MsgBox, Your your screen is at least 1920 pixels wide.
    Return
    F2::
        MsgBox, Your operating system is %A_OSVersion%.
    Return
#If (A_ScreenWidth < 1920)
    F1::
        MsgBox, Your your screen width is smaller than 1920 pixels.
    Return
#If

正如您现在可能已经猜到的那样,热键定义始终由类似hotkey::的模式启动,并由Return关闭。虽然您可以在一行上定义热键。 示例:

F1::MsgBox, Hello!
F2::a ;This will remap the F2 key to an a-key. 

热键本身绝对不会使用花括号!虽然热键中的If - 语句仍然必须根据前面提到的规则使用它们。