0
!c::
    file_name = footnote.ini                             
    restore_original_clipBoard := clipboard
    clipboard =
    KeyWait, Alt                
    KeyWait, c                                           ;small c
    BlockInput, on
    SendEvent, ^{ins}                                   ;^c doesn't work
    ClipWait, 2                                     ; Wait for the clipboard to contain text.
    if ErrorLevel
    {
        MsgBox Failed to save the selection: %clipboard%
        exit
    }
    BlockInput, off
    save_selection := clipboard 

问题:尽管进行了选择,但 Sendevent ^{ins} 不会将其保存到剪贴板。有时我必须重复我的热键,alt + c 几次,然后才能将选择复制到剪贴板。KeyWait 应该确保我只处理 ^{ins} 而没有任何其他密钥。我在这里做错了什么?


更新 我试图强制将选择复制到剪贴板的方法之一是使用 while 循环。我让它通过帖子工作:循环剪贴板和错误级别评估未按预期工作

问题 当我进行选择并按 alt + c 时,有时会卡在我实现的无限循环中。但正如您从该代码中看到的那样:

clipboard := ""
while( StrLen(clipboard) < 1 )
{
    Send, ^{ins}
    Sleep, 50
}
MsgBox % ClipBoard

无限循环在其自身中包含了 ^{ins} 的持续重新发送。出于某种原因,我的选择未被识别为选择。虽然它处于无限循环中,但我尝试重新选择文本。然后它会立即识别它并将我的选择复制到剪贴板。可惜!选择不完整,因为它走得太快了。这个问题并不总是这样。有时它会识别选择的第一个位置!所以有时它会将我的选择复制到我的剪贴板,有时不会。如果没有,则重新发送 ^{ins} 似乎不起作用。我不想让用户重新选择他的选择。那有可能吗?

4

4 回答 4

1

这种方式对我有用:

!vk43:: ; alt+c
   clipContent:=ClipboardAll
   Clipboard:=""
   SendEvent, ^{Ins}
   ClipWait, .75
   MsgBox, % 262 . (ErrorLevel ? 160:208)
         , % ErrorLevel ? "Period expired:":"Result:"
         , % ErrorLevel ? "Failed to save the selection.":Clipboard
         , % (ErrorLevel ? 0:2) . .5
   Clipboard:=clipContent
   KeyWait, vk43
   Return
于 2013-08-12T03:00:37.257 回答
1
!vk43:: ; alt+c
   clipContent:=ClipboardAll ; backup clipboard content (if needed)
   Clipboard:="" ; no comment :)
   Loop
   {
      SendEvent, ^{Ins}
      ClipWait, .75 ; means 750ms, same if write 0.75
      ; assign value of "ErrorLevel" an variable for further usage
      errLvl:=ErrorLevel
      ; monitoring current action (for debugging purpose only)
      TrayTip, % "attempt: #"A_Index
             , % """ErrorLevel"" of ""ClipWait"" command is: "errLvl
   }
   ; here you can set the condition of ending the cycle: either...
   ; ...variable errLvl has not a true value,...
   ; ...or the number of attempts is equal 5
   Until, Not errLvl Or A_Index=5
   ; value of each field of the command "MsgBox"...
   ; ...are set depending on the value of errLvl variable...
   ; ...using a ternary expression
   ; means if errLvl is a true, "options" field is 262160
   MsgBox, % 262 . (errLvl ? 160:208)
         ; means that "title" has a couple variants
         , % errLvl ? "Period expired:":"Result:"
         ; means that "text" has a couple variants
         , % errLvl ? "Failed to save the selection.":Clipboard
         ; means if errLvl is a true, "timeout" field is 0.5 (500ms)
         , % (errLvl ? 0:2) . .5
/* same that and above:
   IfEqual, errLvl, % True, MsgBox, 262160
                                  , % "Period expired:"
                                  , % "Failed to save the selection."
                                  , 0.5
   Else MsgBox, 262208, % "Result:", % Clipboard, 2.5
*/
   TrayTip ; remove "TrayTip" (for debugging purpose only)
   ; save an positive result (if needed)
   IfEqual, errLvl, 0, Sleep, -1, someVar:=Clipboard
   ; return a temporarily saved data into clipboard (if needed)
   Clipboard:=clipContent
   KeyWait, % "vk43"
   Return
于 2013-08-15T01:43:10.463 回答
1
Send {Ctrl Down}{c}{Ctrl Up}

按下 Ctrl+C,您必须立即执行此操作,这是与按下 Ctrl 等待然后按下 C 相对的一个命令。

从未见过用于复制文本的插入键。

还发现这也会发送 Ctrl+C。

Send, ^c

发送插入键使用

{Insert}
于 2013-08-11T19:49:54.253 回答
1

根据我的经验,每当无法可靠地识别击键时,都是由于系统或目标程序跟不上这些键的发送速度。

对于 SendEvent,您可以尝试类似的SetKeyDelay, 1000, 1000方法,看看这是否会有所改善。另一种选择是使用此答案中概述的间歇性睡眠呼叫发送显式向下和向上键。

于 2016-08-26T11:17:17.850 回答