Autohotkey 自动热键脚本:每次仅在记事本中工作:将文本复制到剪贴板,对其进行操作,然后粘贴
我刚刚下载了AutoHotkey并修改了在线找到的一个脚本,但问题是它只能在记事本中持续工作。在Windows程序中,如HTML编辑器或Firefox中的文本区域,它很少工作(似乎只在第二次尝试后工作一次) 脚本功能非常简单:将所选文本复制到剪贴板,插入我在其开头指定的文本以及新行,在其结尾插入新行以及我指定的文本 这是原始脚本,在我提到的其他程序中也不一致。它所做的与上面我想做的类似,只是它不插入任何新行,并且它要求在文本前后插入什么文本 原始脚本:Autohotkey 自动热键脚本:每次仅在记事本中工作:将文本复制到剪贴板,对其进行操作,然后粘贴,autohotkey,Autohotkey,我刚刚下载了AutoHotkey并修改了在线找到的一个脚本,但问题是它只能在记事本中持续工作。在Windows程序中,如HTML编辑器或Firefox中的文本区域,它很少工作(似乎只在第二次尝试后工作一次) 脚本功能非常简单:将所选文本复制到剪贴板,插入我在其开头指定的文本以及新行,在其结尾插入新行以及我指定的文本 这是原始脚本,在我提到的其他程序中也不一致。它所做的与上面我想做的类似,只是它不插入任何新行,并且它要求在文本前后插入什么文本 原始脚本: #i:: clipsav
#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
- 在下面的脚本中,
设置为5,它将等待最长5秒,如果剪贴板复制过程尚未完成,剪贴板的原始内容将恢复ClipWait
[编辑:请参阅我在其他答案中提供的脚本,该脚本使用ClipCopy和ClipPaste函数,以获得更健壮的解决方案。我将此脚本保留在此处,因为它有一些注释和功能,可能对其他密切相关的问题有用。]
- 通常在自动热键中,脚本只起作用或不起作用。但是,对于某些键盘组合,需要进行一些尝试和错误操作,才能使脚本顺利运行。显示了两种方法,将按键设置为
或使用Up
KeyWait
- 使用hWnd而不是窗口标题来标识窗口更可靠
- 将剪贴板内容设置为空,并使用
命令,有助于确保复制延迟既不太短也不太长。遗憾的是,没有类似的命令来确定粘贴完成的等待时间,这是一种尝试和错误ClipWait
- 在下面的脚本中,
设置为5,它将等待最长5秒,如果剪贴板复制过程尚未完成,剪贴板的原始内容将恢复ClipWait
- 在“自动热键”中,当触发脚本的键和脚本发送的键相互干扰时,有时会出现问题,特别是当涉及修改键(如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
}
}
;==================================================