从AutoHotKey脚本在Windows上捕获空白文本的复制/粘贴
默认情况下,在复制文本时,Windows会将其放入剪贴板。但是当试图复制空的文本时,剪贴板未被触摸。例如,在您的编辑器中选择任何文本,然后打到ctrl+c
,都不会导致剪贴板中的更改。从AutoHotKey脚本在Windows上捕获空白文本的复制/粘贴
问题是,我需要用AutoHotKey捕获此事件。由于剪贴板不变,我不知道如何干净地做到这一点(没有超时,这是)。
有没有人有任何想法如何做到这一点?
编辑:为了澄清,我发送AutoHotKey内的ctrl + c。我这样做是为了判断是否选择了任何文本,即我正在发送ctrl + c,然后检查是否有任何文本被复制到剪贴板。问题是,如果没有选择文本,AutoHotKey的剪贴板处理程序永远不会被调用,迫使我使用超时,这是不好的做法。
也许你应该热键Ctrl + C来代替,这种方式随时按下热键,你会知道的。
您可能希望确保将正常的Ctrl + C动作发送到窗口,以便复制。 考虑这个例子:
~^c::
msgbox, % "Clipboard Changed even if you didnt copy anything"
. "(...not really but you tried at least)"
return
该消息将在您每次按下Ctrl + C时火了,即使你没有任何复制到剪贴板。同时你将发送Ctrl + C的本地功能到Windows,这样如果你复制了某些东西,剪贴板将会改变。
从帮助文件:
〜:当热键火灾,其主要的本地函数不会被阻止(从系统中隐藏的)。
您可能还想要一个onClipboardChange来检查剪贴板是否真的改变了。
我想我有一个解决方案。搁置当前剪贴板,然后复制。比较你已经复制到一个空的字符串..如果它是平等的,那么一些东西被复制;否则,不会复制任何内容。然后,将剪贴板恢复到您保存的内容。这是一个演示原理的代码示例。
^#x::
ClipSaved := ClipboardAll ; Save the entire clipboard to a variable of your choice.
; ... here make temporary use of the clipboard, such as for pasting Unicode text via Transform Unicode ...
Clipboard := ; Clear the clipboard
Send, {CTRLDOWN}c{CTRLUP}
if (Clipboard = "") {
Send, you copied nothing
} else {
Send, you copied something
}
Clipboard := ClipSaved ; Restore the original clipboard. Note the use of Clipboard (not ClipboardAll).
ClipSaved = ; Free the memory in case the clipboard was very large.
return
其实,我希望有另一种方法来简单地测试游标是否正在选择任何东西。我在AutoHotkey论坛上提出了这个问题(http://www.autohotkey.com/forum/posting.php?mode=reply & t = 69468),但直到或者如果有更好的答案,我将使用上面的方法。
这是行不通的。问题是,“ctrl + c”需要时间来工作。在您的代码中,在完成“发送,{CTRLDOWN} c {CTRLUP}”后,您马上就会检查剪贴板。但是,整个问题是,在发送“ctrl + c”之后,你应该等待一定的超时时间让Windows有时间来执行ctrl + c操作。您将遇到文字*被选中的边缘情况,但您不会识别它。现在我正在用我目前的工作增加一个新的答案。 – 2011-03-11 08:22:00
“这不起作用”。它确实有效。我会记住超时,但过去几天我一直在使用它,并且还没有看到你描述的问题。 – 2011-03-17 01:57:39
这很奇怪。我看到了这个问题。例如,我尝试创建一个复制文本的命令,在它周围添加引号,然后将其粘贴回去。如果没有超时,当选择大量文本时,有时会无法抓取文本。这取决于您目前电脑的速度。所以要么你还没有遇到它,要么我有一个bug。 – 2011-03-17 07:56:46
这是我目前使用的解决方案。基本上,它归结为发送ctrl+c
,等待一定的超时,然后看看文本是否真的被复制。如果不是,我知道没有选择。
因为Windows需要一定的时间来执行copy
操作,所以没有办法避免等待超时。我将超时设置为0.15秒,所以不会太糟糕。
下面是我用来抓取剪贴板内容或检查它是否为空的功能。我总是调用这个函数先:
clipped_text :=
clip_empty := false
ClipSaved =
is_clipped := false
clip_speed := 0.15
Clip() {
global ClipSaved
global clip_empty
global clipped_text
global is_clipped
global clip_speed
if (!is_clipped) {
ClipSaved := ClipboardAll ; Save the entire clipboard to a variable of your choice.
; msgbox % ClipSaved
is_clipped := true
}
clipboard = ; Empty the clipboard
Send ^{c}
ClipWait clip_speed
if (ErrorLevel = 1)
{
clip_empty := false
}
else
{
clip_empty := true
clipped_text := clipboard
}
}
而且我用这个功能来实际获得剪贴板中的内容或检查它是否是空的:
IsTextSelected() {
global ClipSaved
global clip_empty
global clipped_text
if (clip_empty == true) {
return true
}
else {
return false
}
}
要获取剪贴板我只是看内容在clipped_text变量。
执行“剪辑()”手术后,我总是调用下面的函数来恢复剪贴板(该功能为Clip()
多次调用称为一次):
UnClip() {
global ClipSaved
global clip_empty
global clipped_text
global is_clipped
is_clipped := false
Clipboard := ClipSaved
ClipSaved =
}
这里是我的没有。由于剪贴板是AutoHotkey中的变量,因此可以检查它是否为空。我首先清除剪贴板,发送control + c,然后查看剪贴板是否仍然是空的。如果需要,您可以暂时将当前剪贴板移动到临时位置。
ClipSaved := ClipboardAll
Clipboard = ; empties the clipboard
Send ^+{Left} ; I just used highlight left to select text, you can replace this with
; whatever your program uses to select an input.
Send ^c ; attempt to copy text
If Clipboard = ; checks to see if clipboard is empty
{
break ; Put what you want to do if the clipboard is empty, I used break to stop a loop
}
Clipboard := ClipSaved ; puts the original clipboard contents back
我正在从打开的文档中搜索文本,用户可以在其中选择向前或向后的方向。当倒退时,它会卡在文档开始的循环中。我设置了一个循环限制来防止它成为一个无限循环,但它仍然浪费了等待循环结束的时间。如果剪贴板是空的,我使用break函数结束循环。
为了在信用到期时给予抵免,我从另一篇文章中得到了灵感,其中有其他tood小贴士。它发布你可以用这个脚本检查一个空白变量。 http://www.autohotkey.net/~deleyd/xprxmp/autohotkey_expression_examples.htm#J 五:=“”
If v =
MsgBox v = ""
If (v = "")
MsgBox v = ""
从AutoHotkey的文档网站,我发现了如何临时存储和替换剪贴板的内容。 http://www.autohotkey.com/docs/misc/Clipboard.htm
ClipSaved := ClipboardAll ; Save the entire clipboard to a variable of your choice.
;... here make temporary use of the clipboard, such as for pasting Unicode text via Transform Unicode ...
Clipboard := ClipSaved ; Restore the original clipboard. Note the use of Clipboard (not ClipboardAll).
ClipSaved = ; Free the memory in case the clipboard was very large.
希望这会有所帮助。 塞缪尔
问题是Ctrl + C需要时间才能工作。当您检查它时,完全有可能没有文本出现在剪贴板变量中,而是在几秒后出现。你如何解决这个问题? – 2012-06-04 05:47:25
脚本的巴比伦(适用于Firefox鼠标中键):
MButton::
SetTitleMatchMode, 2
send {LButton}{LButton}
Send ^c
sleep, 100
send {F10}
sleep, 100
SendInput {Raw}%clipboard%
send {enter}
Return
我有同样的问题 - 我将发送复制命令,但它不会复制任何东西。我试着与定时器合作无济于事。
这里是我落得这样做(在尝试不同的模式):
thisclipboard := clipboard . a_now ;add NOW so that it won't possibly be the same as the contents of the clipboard
sendplay,^c
if(clipboard == thisclipboard){
sendinput,^c
}
if(clipboard == thisclipboard){
send,^c
}
虽然不是一个实际的回答这个问题,谷歌搜索可能会在这里,如果你是寻找办法赶上带领你粘贴文本并粘贴前修改它。
这里是消除从剪贴板粘贴文本的空白上CTRL + V脚本:
~^v::
Trimmed := RegExReplace(Clipboard, "^\s+", "")
Trimmed := RegExReplace(Trimmed, "\s+$", "")
Clipboard = %Trimmed%
SendInput ^v
return
的问题是,我编程方式发送CTRL + C,我想看看文本被捕获。我用它来检查是否有选择(即,现在选择的文本,还是不选择)。所以这个解决方案不能帮助我,因为我已经知道ctrl + c正在发送,因为我是发送它的人!尽管如此,谢谢你的创意,我会编辑这个问题,使其更清晰。 – 2010-08-01 21:14:28