Autohotkey脚本:每次仅在记事本中工作:将文本复制到剪贴板,操作它并粘贴它

时间:2016-02-21 03:29:26

标签: autohotkey

我刚刚下载了AutoHotkey并修改了我在网上找到的脚本,但问题是它只能在记事本中保持一致。在Windows程序中,例如HTML编辑器或Firefox中的textarea,它很少有效(它似乎只在第二次尝试后才能工作一次)。

脚本功能非常简单:将所选文本复制到剪贴板,插入我在其开头指定的文本,以及新行,并在其末尾添加新行,以及我指定的文字。

这是原始脚本,在我提到的其他程序中也不能保持一致。它的作用类似于我上面要做的,除了它不插入任何新行,并询问在文本之前和之后插入的文本。

原始剧本:

    #i::

    clipsaved:= ClipboardAll

    Send, ^c
    WinGetTitle, CurrentWinTitle

    InputBox, inputVar, Input character, Input character wHich will surround the text.
    clip := Clipboard
    clip = %inputVar%%clip%%inputVar%

    Clipboard := clip

    WinActivate, %CurrentWinTitle%
    Send, ^v

    Clipboard := clipsaved

return

修改后的脚本:我想要工作的人

    #+c::

    clipsaved:= ClipboardAll

    Send, ^c
    WinGetTitle, CurrentWinTitle

    ; InputBox, inputVar, Input character, Input character wHich will surround the text.
    clip := Clipboard
    ; clip = %inputVar%%clip%%inputVar%
    clip = /*`r`n%clip%`r`n*/

    Clipboard := clip

    WinActivate, %CurrentWinTitle%
    Send, ^v

    Clipboard := clipsaved

return

那么,这里有什么问题?另外,为什么它最初捕获到剪贴板而不是Ctrl + C,最后它做了什么?此外,它的目的是使用Windows当前标题(%CurrentWinTitle%)知道激活位置(WinActivate)。

3 个答案:

答案 0 :(得分:2)

  • 在AutoHotkey中,有时在触发脚本的键和脚本发送的键发生干扰时会出现问题,尤其是涉及Shift / Ctrl / Win / Alt等修改键时。很多时候这种类型的问题,无论是键盘还是鼠标按键,都会给专家带来困难,需要大量的反复试验。

  • 下面链接中的自定义ClipCopy和ClipPaste功能,尽可能地解决这些问题。我在下面的脚本中使用了这些函数,并在下面提供了函数,以获得一个完整的工作脚本,以实现您的目标。

    强大的复制和粘贴例程(函数) - 脚本和函数 - AutoHotkey社区 https://autohotkey.com/board/topic/111817-robust-copy-and-paste-routine-function/

  • 注意:使用hWnd而不是窗口标题来识别窗口,更可靠。此外,clip := ClipCopy(1) 剪切而不是复制文本。

-

;==================================================

#+c::
WinGet, hWnd, ID, A
clipsaved := ClipboardAll

clip := ClipCopy() ; will copy selected text via control + c
; InputBox, inputVar, Input character, Input character wHich will surround the text.
; clip = %inputVar%%clip%%inputVar%
clip = /*`r`n%clip%`r`n*/

WinActivate, ahk_id %hWnd%
ClipPaste(clip)

Clipboard := clipsaved
return

;==============================

ClipCopy(piMode := 0)
{
    clpBackup := ClipboardAll

    Clipboard=

    if (piMode == 1)
        sCopyKey := "vk58sc02D" ; Cut
    else
        sCopyKey := "vk43sc02E" ; Copy

    SendInput, {Shift Down}{Shift Up}{Ctrl Down}{%sCopyKey% Down}
    ClipWait, 0.25
    SendInput, {%sCopyKey% Up}{Ctrl Up}

    sRet := Clipboard

    Clipboard := clpBackup

    return sRet
}

;==============================

ClipPaste(ByRef psText)
{
    if (psText != "")
    {
        clpBackup := ClipboardAll

        sPasteKey := "vk56sc02F" ; Paste

        Clipboard := psText

        SendInput, {Shift Down}{Shift Up}{Ctrl Down}{%sPasteKey% Down}

        ; wait for clipboard is ready
        iStartTime := A_TickCount
        Sleep, % 100
        while (DllCall("GetOpenClipboardWindow") && (A_TickCount-iStartTime<1400)) ; timeout = 1400ms
            Sleep, % 100

        SendInput, {%sPasteKey% Up}{Ctrl Up}

        Clipboard := clpBackup
    }
}

;==================================================

答案 1 :(得分:0)

这应该可以正常工作:
(我评论了大部分代码来回答你的一些问题。)

#+c::
    clipsaved:= ClipboardAll ;makes a backup of the current clipboard content and stores it in the variable "clipsaved"
    Send, {Win Up}{Shift Up}{c Up} ;release the windows key, shift and c key. otherwise things like ctrl+c might mess up
    Send, ^c ;overwrite the clipboard with the current text selection
    Sleep, 100 ; wait for 100 milliseconds to make sure the new clipbaord contents are loaded
    WinGetTitle, CurrentWinTitle

    InputBox, inputVar, Input character, Input character wHich will surround the text.
    Clipboard = %inputVar%`r`n%Clipboard%`r`n%inputVar%
    ;Clipboard = `r`n%Clipboard%`r`n

    WinActivate, %CurrentWinTitle%
    Send, ^v
    Sleep, 100
    Clipboard := clipsaved ;restore the original clipboard contents that where saved to the "clipsaved" variable in the beginning
Return

根据应用程序和CPU负载情况,可能需要也可能不需要睡眠...

答案 2 :(得分:0)

[编辑:请参阅我在其他使用ClipCopy和ClipPaste函数的答案中提供的脚本,以获得更强大的解决方案。我在这里保留这个脚本,因为它有一些注释和功能,可能对其他密切相关的问题有用。]

  • 通常在AutoHotkey中,脚本无论是有效还是无效。但是,对于某些键盘组合,需要进行一些试验和错误才能使脚本顺利运行。显示了两种方法,将密钥设置为Up或使用KeyWait
  • 使用hWnd而不是窗口标题来识别窗口,更可靠。
  • 将剪贴板内容设置为空并使用ClipWait命令,有助于确保复制延迟既不太短也不太长,遗憾的是没有类似的命令来确定等待粘贴的时间长度完成,这是反复试验。
  • 在下面的脚本中,ClipWait设置为5,它将等待最多5秒,如果剪贴板复制过程尚未完成,则将恢复剪贴板的原始内容。

-

#+c::
WinGet, hWnd, ID, A
clipsaved := ClipboardAll

Clipboard := ""

;method 1
Send, {Win Up}{Shift Up}{c Up}

;method 2
;KeyWait, Shift
;KeyWait, LWin
;KeyWait, RWin

Send, ^c
ClipWait, 5
if ErrorLevel
{
Clipboard := clipsaved
clipsaved := ""
Return
}

; InputBox, inputVar, Input character, Input character wHich will surround the text.
clip := Clipboard
; clip = %inputVar%%clip%%inputVar%
clip = /*`r`n%clip%`r`n*/

Clipboard := clip

WinActivate, ahk_id %hWnd%
Send, ^v
Sleep 3000

Clipboard := clipsaved

return