自动热键设置不起作用

时间:2012-05-08 20:04:13

标签: autoit

我正在尝试制作某种简单的剪贴板控制器,当使用热键(Ctrl + Shift + Q)时,用户可以将多个项目复制到剪贴板,而不是使用Ctrl + C时只有一个项目,并且可以一次粘贴它们(Ctrl + Shift + W),或直接粘贴前10个项目中的任何一个(Ctrl + Shift + 1 ... 9),另一个选项是清除剪贴板(Ctrl + Shift + ' - '。)

问题是它只适用于多个复制和粘贴,但是然后尝试进行复制操作,没有任何内容添加到缓冲区中。 我想弄清楚,但找不到理由......

这是代码:

注意:问题应该在addToClipboard()或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

3 个答案:

答案 0 :(得分:2)

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

复制到剪贴板需要花费很少的时间 特别大的物品。发送后睡觉

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

无论如何都喜欢你的剧本..idea

答案 1 :(得分:1)

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

解决方案是等待用户使用Ctrl+Shift+C函数引发这些键,然后释放所有键后,执行代码。进入该功能时禁用热键也是明智之举(并在离开时重新启用),以便长时间按住热键不会继续触发该功能。

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

答案 2 :(得分:1)

希望这是问题的结束,我找到了另一种从剪贴板设置/获取数据的方法:_ClipBoard_SetData ()&amp;来自库_ClipBoard_GetData()的{​​{1}},在尝试它们之后运行良好,毕竟看起来问题在于设置和从剪贴板获取数据。 将来会是以确保其最终是否正确