0

CTRL使用热键 ( ++ )时,我的剪贴板控制器可以将多个项目复制到剪贴板,而不是只复制一个项目,并一次粘贴所有项目 ( + SHIFT+ ),或直接粘贴前 10 个项目中的任何一个( + + ... ) . 另一种选择是清除剪贴板 ( ++ ) 。QCTRLSHIFTWCTRLSHIFT19CTRLSHIFT-

它仅适用于多次复制和粘贴,但随后尝试进行复制操作时不会将任何内容添加到缓冲区中。我找不到原因。

代码(问题应该在addToClipboard()or中getAll()):

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <array.au3>

Global $clipBoard[50]=[""]
Global $counter = 0

HotKeySet("^+q","addToClipboard")
HotKeySet("^+-","emptyAll")
HotKeySet("^+w","getAll")
HotKeySet("^+1","get1")
HotKeySet("^+2","get2")
HotKeySet("^+3","get3")
HotKeySet("^+4","get4")
HotKeySet("^+5","get5")
HotKeySet("^+6","get6")
HotKeySet("^+7","get7")
HotKeySet("^+8","get8")
HotKeySet("^+9","get9")

$hGUI = GuiCreate("Clipboard Controller", 100, 100,Default,Default,$WS_SIZEBOX)
GUISetState()

Func addToClipboard()
    Send ("^c")
    $copied = ClipGet()
    $clipBoard[Mod($counter,50)] = $copied
    $counter +=1
EndFunc

Func getByIndex($i)
    $statement = $clipBoard[$i]
    ClipPut($statement)
    Send("^v")
EndFunc

Func getAll()
    $statement =""
    For $i In $clipBoard
        If $i <> "" Then
            $statement &= $i & @CRLF
        EndIf
    Next
    ClipPut($statement)
    Send("^v")
EndFunc

Func emptyAll()
    For $i=0 To 49
        $clipBoard[$i]=""
    Next
    ClipPut("")
EndFunc

Func get1()
    getByIndex(0)
EndFunc

Func get2()
    getByIndex(1)
EndFunc

Func get3()
    getByIndex(2)
EndFunc

Func get4()
    getByIndex(3)
EndFunc

Func get5()
    getByIndex(4)
EndFunc

Func get6()
    getByIndex(5)
EndFunc

Func get7()
    getByIndex(6)
EndFunc

Func get8()
    getByIndex(7)
EndFunc

Func get9()
    getByIndex(8)
EndFunc

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd
4

3 回答 3

2

问题是一个古老的陷阱......

复制到剪贴板需要很少的时间,尤其是大项目..发送后尝试睡眠

Func addToClipboard()
Send ("^c")
sleep(1000) ; try different values
    $copied = ClipGet()
$clipBoard[Mod($counter,50)] = $copied
$counter +=1
EndFunc

反正喜欢你的剧本..idea

于 2012-12-24T12:16:39.030 回答
1

问题是代码addToClipboard正在运行,而用户仍然按下按键。结果,Send旨在发送的命令Ctrl+C实际上是正在发送Ctrl+Shift+C,因此永远不会复制文本。

解决方案是等待用户使用该_IsPressed功能抬起这些键,然后在释放所有键后执行代码。当您进入该功能时禁用热键(并在您离开时重新启用)也可能是明智的,这样长时间按住热键不会继续触发该功能。

另一种方法是将WM_COPY消息直接发送到具有焦点的控件。这不能保证对每个控件都有效(尽管如果没有,我会感到非常惊讶)。这将是一种更可靠的方法。

于 2012-05-08T20:33:00.823 回答
1

希望这是问题的结束,我找到了另一种从剪贴板设置/获取数据的方法,函数:_ClipBoard_SetData ()&_ClipBoard_GetData()从库<Clipboard.au3>中,在尝试它们之后效果很好,毕竟问题似乎在于从剪贴板设置和获取数据.. 稍后会出现 isA 以确保其最终是否正确

于 2012-05-14T13:34:39.250 回答