默认情况下,在Windows上,当复制文本时,它会被放入剪贴板中。但是,当试图复制空文本时,剪贴板是不动的。例如,在编辑器中选择任何文本,然后点击ctrl+c
,将不会导致剪贴板中的任何更改。
问题是,我需要用AutoHotKey来捕捉这个事件。由于剪贴板是不变的,我不知道如何干净地(没有超时,也就是)这样做。
有人知道怎么做吗?
编辑:澄清,我从AutoHotKey内部发送ctrl+c。我这样做是为了判断是否选择了任何文本,即发送ctrl+c,然后检查是否有文本被复制到剪贴板上。问题是,如果没有选择文本,AutoHotKey的剪贴板处理程序就永远不会被调用,迫使我使用超时,这不是很好的做法。
发布于 2012-06-03 15:40:08
这就是我所做的。因为剪贴板是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
我从一个打开的文档中搜索文本,用户可以在其中选择向前或向后的方向。当倒退时,它会被卡在文档开头的一个循环中。我设置了一个循环限制,以防止它成为一个无限循环,但它仍然浪费了等待循环完成的时间。如果剪贴板是空的,我使用中断函数结束循环。
为了在值得表扬的地方给予表扬,我从另一篇有其他技巧的帖子中得到了灵感。它发布了你可以用这个脚本检查一个空变量。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.
希望这能有所帮助。塞缪尔
发布于 2011-03-11 00:29:43
下面是我目前使用的解决方案。基本上,这可以归结为发送ctrl+c
,等待一定的超时,然后查看文本是否真的被复制。如果不是的话,我知道没有选择。
afaik无法避免等待超时,因为执行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()“操作后,我总是调用以下函数来恢复剪贴板(此函数对Clip()
的多次调用只调用一次):
UnClip() {
global ClipSaved
global clip_empty
global clipped_text
global is_clipped
is_clipped := false
Clipboard := ClipSaved
ClipSaved =
}
发布于 2010-08-01 11:58:46
也许你应该用热键来代替Ctrl +C,那样的话,只要按下这个热键,你就会知道。
您可能需要确保将普通的Ctrl +C操作发送到windows,以便您可以复制。考虑一下这个例子:
~^c::
msgbox, % "Clipboard Changed even if you didnt copy anything"
. "(...not really but you tried at least)"
return
即使你没有把任何东西复制到剪贴板上,每次你按下Ctrl +C键时,这个消息都会启动。同时,您将把Ctrl +C的本机函数发送到windows,这样如果您复制了什么东西,剪贴板就会改变。
在帮助文件中:
~:当热键触发时,其键的本机功能不会被阻塞(隐藏在系统中)。
您可能还希望有一个onClipboardChange
来检查剪贴板何时真正改变了。
https://stackoverflow.com/questions/3381451
复制