2012-05-08 75 views
0

我试图做一些简单的剪贴板控制器,其中用户可以有几个项目复制到剪贴板时使用热键(Ctrl + Shift + Q),而不是只有一个项目时使用Ctrl + C,并且可以一次全部粘贴它们(Ctrl + Shift + W),或者直接粘贴前10个项目中的任何一个(Ctrl + Shift + 1 ... 9),另一个选项是清除剪贴板(Ctrl + Shift + ' - ')。Autoit热键不工作

问题是,它只适用于多个复制和粘贴,但然后试图进行复制操作没有任何东西被添加到缓冲区.. 我想弄明白,但找不到原因..

这里是代码:

注:这个问题应该在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 

回答

2

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

这需要时间少量复制到剪辑板 尤其是大件物品..发一条睡后送

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

反正喜欢你的script..idea

0

的问题是addToClipboard是代码在用户的同时运行仍然按下按键。因此,旨在发送Ctrl+CSend命令实际上是发送Ctrl+Shift+C,因此文本从不复制。

解决方案是等待用户使用_IsPressed函数提升这些密钥,然后一旦所有密钥都被释放,就执行该代码。在进入功能时关闭热键(在离开时重新启用)也是明智的做法,以便长时间保持热键不会触发该功能。

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

+0

已经了解您的回复,并通过[这个员额(http://stackoverflow.com/questions/7936831/convert-clipboard-to-keystroke引导) 我写了下面的代码(http://codepad.org/mqtT58Rn),但也没有工作.. –

+0

@aur,可以通过传递“”代替函数来完全取消热键的设置,而是比使用假人。我将不得不多看看你在那里做错了什么。 – Matt

1

希望这是问题的结束,我发现了另一种方式来设置/获取剪贴板数据,功能:从库<Clipboard.au3>_ClipBoard_SetData() & _ClipBoard_GetData(),想他们以后效果不错,毕竟这似乎是这个问题是设置和获取数据从剪贴板.. 会后,ISA,以确保其最终正确与否