Autohotkey 自动热键脚本:每次仅在记事本中工作:将文本复制到剪贴板,对其进行操作,然后粘贴

Autohotkey 自动热键脚本:每次仅在记事本中工作:将文本复制到剪贴板,对其进行操作,然后粘贴,autohotkey,Autohotkey,我刚刚下载了AutoHotkey并修改了在线找到的一个脚本,但问题是它只能在记事本中持续工作。在Windows程序中,如HTML编辑器或Firefox中的文本区域,它很少工作(似乎只在第二次尝试后工作一次) 脚本功能非常简单:将所选文本复制到剪贴板,插入我在其开头指定的文本以及新行,在其结尾插入新行以及我指定的文本 这是原始脚本,在我提到的其他程序中也不一致。它所做的与上面我想做的类似,只是它不插入任何新行,并且它要求在文本前后插入什么文本 原始脚本: #i:: clipsav

我刚刚下载了AutoHotkey并修改了在线找到的一个脚本,但问题是它只能在记事本中持续工作。在Windows程序中,如HTML编辑器或Firefox中的文本区域,它很少工作(似乎只在第二次尝试后工作一次)

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

这是原始脚本,在我提到的其他程序中也不一致。它所做的与上面我想做的类似,只是它不插入任何新行,并且它要求在文本前后插入什么文本

原始脚本:

    #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)的目的是什么。

这应该可以正常工作:
(我对大部分代码进行了注释,以回答您的一些问题。)

睡眠可能是必要的,也可能不是必要的,这取决于应用程序和CPU负载

这应该可以正常工作:
(我对大部分代码进行了注释,以回答您的一些问题。)


睡眠可能是必要的,也可能不是必要的,这取决于应用程序和CPU负载

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

  • 通常在自动热键中,脚本只起作用或不起作用。但是,对于某些键盘组合,需要进行一些尝试和错误操作,才能使脚本顺利运行。显示了两种方法,将按键设置为
    Up
    或使用
    KeyWait

  • 使用hWnd而不是窗口标题来标识窗口更可靠

  • 将剪贴板内容设置为空,并使用
    ClipWait
    命令,有助于确保复制延迟既不太短也不太长。遗憾的是,没有类似的命令来确定粘贴完成的等待时间,这是一种尝试和错误

  • 在下面的脚本中,
    ClipWait
    设置为5,它将等待最长5秒,如果剪贴板复制过程尚未完成,剪贴板的原始内容将恢复


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

  • 通常在自动热键中,脚本只起作用或不起作用。但是,对于某些键盘组合,需要进行一些尝试和错误操作,才能使脚本顺利运行。显示了两种方法,将按键设置为
    Up
    或使用
    KeyWait

  • 使用hWnd而不是窗口标题来标识窗口更可靠

  • 将剪贴板内容设置为空,并使用
    ClipWait
    命令,有助于确保复制延迟既不太短也不太长。遗憾的是,没有类似的命令来确定粘贴完成的等待时间,这是一种尝试和错误

  • 在下面的脚本中,
    ClipWait
    设置为5,它将等待最长5秒,如果剪贴板复制过程尚未完成,剪贴板的原始内容将恢复

  • 在“自动热键”中,当触发脚本的键和脚本发送的键相互干扰时,有时会出现问题,特别是当涉及修改键(如Shift/Ctrl/Win/Alt)时。通常这种问题,无论是键盘还是鼠标按下,都会给专家带来困难,需要大量的尝试和错误

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

    健壮的复制和粘贴例程(函数)-脚本和函数-自动热键社区

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

-

==================================================
#+c::
WinGet,hWnd,ID,A
clipsaved:=剪贴簿
clip:=ClipCopy();将通过control+c复制所选文本
; InputBox、inputVar、输入字符、将围绕文本的输入字符。
; clip=%inputVar%%clip%%inputVar%
clip=/*`r`n%clip%`r`n*/
WinActivate,ahk_id%hWnd%
ClipPaste(夹子)
剪贴板:=clipsaved
返回
;==============================
ClipCopy(piMode:=0)
{
clpBackup:=剪贴簿
剪贴板=
如果(piMode==1)
sCopyKey:=“vk58sc02D”;切割
其他的
sCopyKey:=“vk43sc02E”;副本
SendInput,{Shift-Down}{Shift-Up}{Ctrl-Down}{%sCopyKey%Down}
克利普韦特,0.25
SendInput,{%sCopyKey%Up}{Ctrl-Up}
sRet:=剪贴板
剪贴板:=clpBackup
返回sRet
}
;==============================
ClipPaste(ByRef psText)
{
如果(psText!=“”)
{
clpBackup:=剪贴簿
sPasteKey:=“vk56sc02F”;粘贴
剪贴板:=psText
SendInput,{Shift Down}{Shift Up}{
#+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
#+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
;==================================================

#+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
    }
}

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