Поймать копировать / вставить пустой текст в Windows из скрипта AutoHotKey - PullRequest
3 голосов
/ 01 августа 2010

По умолчанию в Windows при копировании текста он помещается в буфер обмена.Но при попытке скопировать пустой текст буфер обмена остается нетронутым.Например, если в редакторе нет текста, а затем нажать ctrl+c, изменения в буфере обмена не произойдут.

Проблема в том, что мне нужно отловить это событие с помощью AutoHotKey.Поскольку буфер обмена не изменился, я понятия не имею, как сделать это чисто (то есть без тайм-аута).

У кого-нибудь есть идеи, как это сделать?

Править: Чтобы уточнить, я посылаю Ctrl + C из AutoHotKey.Я делаю это, чтобы сказать, выделен ли какой-либо текст, т.е. я посылаю Ctrl + C, а затем проверяю, был ли какой-либо текст скопирован в буфер обмена или нет.Проблема в том, что если текст не выделен, обработчики буфера обмена для AutoHotKey никогда не вызываются, что вынуждает меня использовать тайм-аут, что не является хорошей практикой.

Ответы [ 7 ]

3 голосов
/ 04 июня 2012

Вот что я сделал.Поскольку буфер обмена является переменной в 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 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.

Надеюсь, это поможет.Samuel

2 голосов
/ 09 июля 2014

Хотя это и не фактический ответ на этот вопрос, поиск в Google может привести вас сюда, если вы ищете способ перехватить текст при вставке и изменить его перед вставкой .

Вот скрипт, который удаляет пробелы из текста, вставленного из буфера обмена на CTRL + V :

~^v::
Trimmed := RegExReplace(Clipboard, "^\s+", "")
Trimmed := RegExReplace(Trimmed, "\s+$", "")
Clipboard = %Trimmed%
SendInput ^v
return
2 голосов
/ 11 марта 2011

Вот решение, которое я сейчас использую.По сути, все сводится к отправке 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 () я всегда вызываю следующую функцию для восстановления буфера обмена (эта функция вызывается один раз для нескольких вызововиз Clip()):

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

    is_clipped := false
    Clipboard := ClipSaved
    ClipSaved =
}
0 голосов
/ 10 марта 2013

У меня была такая же проблема - я посылал команду копирования, но она ничего не копировала Я пытался работать с таймерами безрезультатно.

Вот что я в итоге делал (пробовал разные режимы):

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 голосов
/ 30 декабря 2012

Сценарий для Вавилона (средняя клавиша мыши для Firefox):

MButton::
SetTitleMatchMode, 2
send {LButton}{LButton}
Send ^c
sleep, 100
send {F10}
sleep, 100
SendInput {Raw}%clipboard%
send {enter}
Return
0 голосов
/ 11 марта 2011

Я думаю, у меня есть решение. Отложите текущий буфер обмена, затем скопируйте. Сравните то, что вы скопировали, с пустой строкой ... если она равна, то что-то было скопировано; в противном случае ничего не было скопировано. Затем восстановите буфер обмена до того, что вы сохранили. Вот пример кода, демонстрирующий принцип.

^#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),, но до тех пор, пока не будет получен лучший ответ, я буду использовать вышеуказанный метод.

0 голосов
/ 01 августа 2010

Возможно, вам следует вместо этого использовать горячие клавиши 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 в окна, чтобы ваш буфер обмена изменился, если вы скопировали что-либо.

Из файла справки:

~ : Когда горячая клавиша срабатывает, собственная функция ее клавиши не блокируется (скрыта от системы).

Возможно, вы захотите также иметь onClipboardChange для проверки, когда буфер обмена действительноизмененное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...