2010-08-01 97 views
1

默认情况下,在复制文本时,Windows会将其放入剪贴板。但是当试图复制空的文本时,剪贴板未被触摸。例如,在您的编辑器中选择任何文本,然后打到ctrl+c,都不会导致剪贴板中的更改。从AutoHotKey脚本在Windows上捕获空白文本的复制/粘贴

问题是,我需要用AutoHotKey捕获此事件。由于剪贴板不变,我不知道如何干净地做到这一点(没有超时,这是)。

有没有人有任何想法如何做到这一点?

编辑:为了澄清,我发送AutoHotKey内的ctrl + c。我这样做是为了判断是否选择了任何文本,即我正在发送ctrl + c,然后检查是否有任何文本被复制到剪贴板。问题是,如果没有选择文本,AutoHotKey的剪贴板处理程序永远不会被调用,迫使我使用超时,这是不好的做法。

回答

0

也许你应该热键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来检查剪贴板是否真的改变了。

+0

的问题是,我编程方式发送CTRL + C,我想看看文本被捕获。我用它来检查是否有选择(即,现在选择的文本,还是不选择)。所以这个解决方案不能帮助我,因为我已经知道ctrl + c正在发送,因为我是发送它的人!尽管如此,谢谢你的创意,我会编辑这个问题,使其更清晰。 – 2010-08-01 21:14:28

0

我想我有一个解决方案。搁置当前剪贴板,然后复制。比较你已经复制到一个空的字符串..如果它是平等的,那么一些东西被复制;否则,不会复制任何内容。然后,将剪贴板恢复到您保存的内容。这是一个演示原理的代码示例。

^#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),但直到或者如果有更好的答案,我将使用上面的方法。

+1

这是行不通的。问题是,“ctrl + c”需要时间来工作。在您的代码中,在完成“发送,{CTRLDOWN} c {CTRLUP}”后,您马上就会检查剪贴板。但是,整个问题是,在发送“ctrl + c”之后,你应该等待一定的超时时间让Windows有时间来执行ctrl + c操作。您将遇到文字*被选中的边缘情况,但您不会识别它。现在我正在用我目前的工作增加一个新的答案。 – 2011-03-11 08:22:00

+0

“这不起作用”。它确实有效。我会记住超时,但过去几天我一直在使用它,并且还没有看到你描述的问题。 – 2011-03-17 01:57:39

+1

这很奇怪。我看到了这个问题。例如,我尝试创建一个复制文本的命令,在它周围添加引号,然后将其粘贴回去。如果没有超时,当选择大量文本时,有时会无法抓取文本。这取决于您目前电脑的速度。所以要么你还没有遇到它,要么我有一个bug。 – 2011-03-17 07:56:46

1

这是我目前使用的解决方案。基本上,它归结为发送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 = 
} 
2

这里是我的没有。由于剪贴板是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. 

希望这会有所帮助。 塞缪尔

+0

问题是Ctrl + C需要时间才能工作。当您检查它时,完全有可能没有文本出现在剪贴板变量中,而是在几秒后出现。你如何解决这个问题? – 2012-06-04 05:47:25

0

脚本的巴比伦(适用于Firefox鼠标中键):

MButton:: 
SetTitleMatchMode, 2 
send {LButton}{LButton} 
Send ^c 
sleep, 100 
send {F10} 
sleep, 100 
SendInput {Raw}%clipboard% 
send {enter} 
Return 
0

我有同样的问题 - 我将发送复制命令,但它不会复制任何东西。我试着与定时器合作无济于事。

这里是我落得这样做(在尝试不同的模式):

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 
    } 
0

虽然不是一个实际的回答这个问题,谷歌搜索可能会在这里,如果你是寻找办法赶上带领你粘贴文本并粘贴前修改它

这里是消除从剪贴板粘贴文本的空白上CTRL + V脚本:

~^v:: 
Trimmed := RegExReplace(Clipboard, "^\s+", "") 
Trimmed := RegExReplace(Trimmed, "\s+$", "") 
Clipboard = %Trimmed% 
SendInput ^v 
return