2016-03-13 133 views
0

我正在嘗試創建熱鍵來模擬我在玩的在線遊戲中的輸入緩衝,該遊戲本身並不支持輸入緩衝,意思是搗毀一個咒語鍵,以便在前一個咒語完成投擲後熄滅是最好的方法手動執行。如何在AutoHotkey中將多個類似的熱鍵濃縮爲一個熱鍵?

在熱鍵的幫助下,我可以通過按住我的按鍵以最小的延遲來循環按鍵,以便它發送完成前一個咒語的瞬間。

但是爲每個按鈕創建多個熱鍵我已將鍵盤綁定到拼寫上,這似乎很乏味,我不確定如何使用一組定義的鍵將這些熱鍵壓縮成一個(即1到6和F1通過F6)

我的代碼示例片段至今只有3個考慮鍵:

$5:: 
{ 
    Loop 
    { 
     Loop, 5 
     { 
      Send, 5 
      Sleep, 1 
     } 
     GetKeyState, state, 5 
     if state = U 
      break 
    } 
    return 
} 

$2:: 
{ 
    Loop 
    { 
     Loop, 5 
     { 
      Send, 2 
      Sleep, 1 
     } 
     GetKeyState, state, 2 
     if state = U 
      break 
    } 
    return 
} 

$F2:: 
{ 
    Loop 
    { 
     Loop, 5 
     { 
      Send, {F2} 
      Sleep, 1 
     } 
     GetKeyState, state, F2 
     if state = U 
      break 
    } 
    return 
} 

我試圖濃縮成這樣的事情,如果可能的話:

hotkeys := [5, 2, F2] 
hotkeyCount := hotkeys.MaxIndex() 
curKey := 1 

Loop, hotkeyCount 
{ 
    hotkeyIndex := hotkeys[curKey] 
    $%hotkeyIndex%:: 
    { 
     Loop 
     { 
      Loop, 5 
      { 
       Send, {%hotkeyIndex%} 
       Sleep, 1 
      } 
      GetKeyState, state, %hotkeyIndex% 
      if state = U 
       break 
     } 
     return 
    } 
    curKey := curKey + 1 
} 

回答

1

創建一個FIFO堆棧,可以保護預設操作並在準備就緒時調用它們。

陣列functions所包含的功能:Function_aFunction_bFunction_c,已觸發各自的熱鍵,abc。 熱鍵不直接調用函數,但將其數字索引添加到堆棧stack

定時器checkstack中檢索數字索引,然後調用該索引處數組functions中的函數。當函數返回時,如果有下一個索引,則檢索下一個索引。一次只能運行一個功能。

SetBatchLines, -1 

global stack := Object() 
global stack_head = 0 
global stack_tail = 0 
global functions := [Func("Function_a"),Func("Function_b"),Func("Function_c")] 

SetTimer, check , 25 

return 

check: 
    if(stack_head > stack_tail) 
    { 
     i := stack[stack_tail] 
     functions[i]() 
     stack_tail++ 
    } 
return 

Function_a() 
{ 
    tooltip, Function_a running... 
    Sleep, 1000 
    tooltip, 
    return 
} 

Function_b() 
{ 
    tooltip, Function_b running... 
    Sleep, 1000 
    tooltip, 
    return 
} 

Function_c() 
{ 
    tooltip, Function_c running... 
    Sleep, 1000 
    return 
} 

a:: 
    stack[stack_head] := 1 
    stack_head++ 
return 

s:: 
    stack[stack_head] := 2 
    stack_head++ 
return 

d:: 
    stack[stack_head] := 3 
    stack_head++ 
return 

這使的功能同時運行,可以做任何你想要的,而在同一時間的快捷鍵可以添加行爲(函數索引)堆棧,這將在順序被稱爲他們加入一個在一次。


我已經編輯您例如,使其功能:

$a:: 
$s:: 
$d:: 
$1:: 

key := A_ThisHotkey 
key :=Trim(key,"$") 
Loop 
{ 
    Loop, 5 
    { 
     SendInput, %key% 
     Sleep, 1 
    } 
    state := GetKeyState(key , "P") 
    if state = 0 
    { 
     break 
    } 
} 

return 
+0

有沒有辦法做到這一點不爲每個熱鍵綁定創建單獨的線?這似乎並沒有被壓縮,除非我失去了一些東西......我不介意如果按鍵不能一起按下,我介意製作16個不同的熱鍵,而不僅僅是輸入一個字母到數組中將該密鑰添加到我的腳本 – Erin

+0

@Erin您必須編寫熱鍵,否則您將如何獲得不同的操作?你在你的例子中定義了3個熱鍵和一些他們執行的動作。考慮到它們的大小,我的例子實際上更加緊湊。 – 2501

+0

我編輯我的帖子,也許我的例子比我更好地澄清我試圖解釋我正在試圖用語言來完成 – Erin