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 ドキュメント Web サイトから、クリップボードのコンテンツを一時的に保存して置き換える方法を見つけました。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

この質問に対する実際の回答ではありませんが、貼り付け時にテキストをキャッチして貼り付ける前に変更する方法を探している場合は、Google 検索でここにたどり着く可能性があります。

クリップボードから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のネイティブ関数をウィンドウに送信するので、何かをコピーするとクリップボードが変更されます。

ヘルプファイルから:

:ホットキーが起動しても、そのキーのネイティブ機能はブロックされません(システムから隠されます)。

onClipboardChangeクリップボードが実際にいつ変更されたかを確認することもできます。

于 2010-08-01T19:58:46.623 に答える
0

私は同じ問題を抱えていました.copyコマンドを送信しましたが、何もコピーしませんでした. タイマーを使ってみましたが無駄でした。

これが私がやったことです(さまざまなモードを試しています):

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

解決策があると思います。現在のクリップボードを脇に置いてから、コピーします。コピーしたものを空の文字列と比較します。等しい場合は、何かがコピーされています。それ以外の場合、何もコピーされませんでした。次に、クリップボードを保存したものに戻します。原則を示すコードサンプルを次に示します。

^#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 に答える
0

babylon のスクリプト (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 に答える