我刚刚下载了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)。
答案 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函数的答案中提供的脚本,以获得更强大的解决方案。我在这里保留这个脚本,因为它有一些注释和功能,可能对其他密切相关的问题有用。]
Up
或使用KeyWait
。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