3

默认情况下,在 Windows 上,复制文本时,它会被放入剪贴板。但是当试图复制文本时,剪贴板是不变的。例如,在编辑器中不选择任何文本,然后点击ctrl+c,将导致剪贴板没有变化。

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

有谁知道如何做到这一点?

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

4

7 回答 7

4

这就是我所做的。由于剪贴板是 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 函数结束循环。

为了在应得的地方给予赞扬,我从另一篇有其他提示的帖子中获得了灵感。它发布了您可以使用此脚本检查空白变量。 http://www.autohotkey.net/~deleyd/xprxmp/autohotkey_expression_examples.htm#J v := ""

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.

希望这可以帮助。塞缪尔

于 2012-06-03T23:40:08.753 回答
2

这是我目前使用的解决方案。基本上,它归结为发送ctrl+c,等待一定的超时,然后查看是否实际复制了文本。如果不是,我知道没有选择。

没有办法,afaik,避免等待超时,因为 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()”操作后,我总是调用以下函数来恢复剪贴板(多次调用时调用该函数一次Clip()):

UnClip() {
    global ClipSaved
    global clip_empty
    global clipped_text
    global is_clipped

    is_clipped := false
    Clipboard := ClipSaved
    ClipSaved =
}
于 2011-03-11T08:29:43.060 回答
2

虽然不是这个问题的实际答案,但如果您正在寻找一种在粘贴时捕获文本并在粘贴之前对其进行修改的方法,谷歌搜索可能会引导您到这里。

CTRL这是从+上从剪贴板粘贴的文本中消除空格的脚本V

~^v::
Trimmed := RegExReplace(Clipboard, "^\s+", "")
Trimmed := RegExReplace(Trimmed, "\s+$", "")
Clipboard = %Trimmed%
SendInput ^v
return
于 2014-07-09T16:47:26.220 回答
0

也许您应该改为热键 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检查剪贴板何时真正更改。

于 2010-08-01T19:58:46.623 回答
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
    }
于 2013-03-10T05:14:08.813 回答
0

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

MButton::
SetTitleMatchMode, 2
send {LButton}{LButton}
Send ^c
sleep, 100
send {F10}
sleep, 100
SendInput {Raw}%clipboard%
send {enter}
Return
于 2012-12-30T10:52:31.513 回答
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) 上问过这个问题,但直到或如果有更好的答案,我将使用上述方法。

于 2011-03-10T23:59:14.117 回答