2013-06-25 99 views
0

我想創建一個熱鍵,它發送一些密鑰,然後爲另一個熱鍵發送密鑰,然後發送第三個密鑰。Autohotkey發送密鑰,讓它觸發其他熱鍵(#InputLevel混淆)

這似乎是可能的,使用#InputLevel

#InputLevel 1 
a::b 
#InputLevel 0 
b::c 

如預期上述工程:通過按一個我得到Ç

但是,我不僅要重新映射第一個密鑰:我想在發送密鑰之前做更多。所以,我想我可能只是重寫一點點上面:

#InputLevel 1 
Hotkey *a, foo 
#InputLevel 0 
b::c 

foo: 
    ; Do something more here … 
    SendInput {Blind}b 
    return 

以上按預期但不工作:通過按一個我得到b(不Ç)。

更新:@Robert Ilbrink提醒我,你可以執行多個命令,而無需使用Hotkey命令:

#InputLevel 1 
*a:: 
    ; Do something here … 
    SendEvent {Blind}b 
    return 
#InputLevel 0 
b::c 

上面確實給預期的效果:按一個導致Ç 。但是,我必須重新解釋我的問題。我想問題是:我需要動態設置熱鍵,這意味着我必須使用帶有標籤的Hotkey命令(據我所知)。 (另請注意,我用SendEvent使用上面SendInput產生b奇數。)

(更新完)

我知道有一個伴侶命令#InputLevel - SendLevel哪位可能有關。我試過把它放在很多地方,但它從來沒有任何區別。

所以,這是一個簡化的理論例子。將a重新映射到b當然是無用的(當然,最終的結果可以通過a::c來實現)。關於我的用例。請記住,如果事實證明「真實」解決方案意味着正在嘗試以其他方式進行,我仍然有興趣瞭解有關#InputLevelSendLevel的更多信息,以及爲什麼我的示例無法按預期工作。

我正在執行dual-role modifier keys。例如,發送按單獨RSHIFT的時候,但RSHIFT + 關鍵時與其他一些關鍵的擠壓在一起。基本上,RShift在keydown和RShift up on keyup。但是,這有一個缺陷:即使將RShift與其他一些密鑰仍然發送。所以腳本需要知道何時有組合。我的解決辦法是熱鍵添加到所有字母鍵,方向鍵和其他一些按鍵,像這樣:

for comboKey in filteredComboKeys { 
    Hotkey % "*" comboKey, Dual_comboKey 
} 

; Later in script: 

Dual_comboKey: 

    ; The following function lets the dual-role modifier keys know that they have 
    ; been combined with another key (and a few other things, which I don't think 
    ; are important for the issue.) 
    Dual.combo() ; 

    key := Dual.cleanKey(A_ThisHotkey) 
    SendInput {Blind}%key% 

    return 

上述解決方案都非常好,我的目的,不同之處在於打破了所有的重新映射和其它熱鍵用戶可能會造成:這些根本不會發生。

回答

3

爲什麼不:

a:: 
; Do something 
Send, b 
Return 
+0

啊,我怎麼能忘記有關語法?這確實讓我做了更多的事情,而不僅僅是重映射。 (有趣的是,'SendInput'不起作用。)但是,我必須使用'Hotkey'命令,因爲「comboKey​​s」是動態的 - 它們甚至可以由用戶設置爲支持除a-z之外的其他字符。 – lydell

+0

我已經更新了現在的問題。感謝和+1解決了簡化示例中的第一個問題(能夠進行多次重新映射)。 – lydell

0

據我所知,#InputLevel不會對Hotkey命令咬人。不過,我無意中發現了一個解決方案,我最初發布的片段之一:

Hotkey *a, foo 
b::c 

foo: 
    ; Do something more here … 
    SendLevel 1 
    SetKeyDelay 0 ; Optional; Only affects this hotkey. 
    SendEvent {Blind}b 
    return 

注意SendEvent必須使用。 SendInput產生bSendPlay什麼都沒產生。我不知道爲什麼。

但是,如果您想發送熱鍵本身,此技術將無法使用。然後你最終陷入無限循環。使用鍵盤掛鉤不起作用,因爲SendLevel會覆蓋它。

所以,我有一個答案,解決了最初的例子之一,但實際上並沒有幫助我。我需要自己發送熱鍵。我想我必須讓用戶使用我的腳本重新映射他們的密鑰。嘆。

更新:

我現在公佈my dual-role modifiers script,如果有人有興趣更多的細節,以及如何我處理的問題。

更新:

我已經更新了我的雙重角色修飾符腳本。我現在遠離Hotkey命令。我認爲,處理這種事情更容易。

0

現在(開始的AutoHotkey 1.1.01),這可以很容易地實現像這樣:

~Shift up:: 
    IfInString, A_PriorKey, Shift 
    { 
     Send) 
    } 
return