Endlich herausgefunden.
tl; dr
Durch ^eersten gewünschten Tastendruck ersetzen . Ersetzen Sie den 3zweiten gewünschten Tastendruck durch den ASCII-Index. Dies erzwingt, dass Ctrldurch beide Tastenanschläge gehalten wird, andernfalls wird abgebrochen.
~$Ctrl UP::
ChordIsBroken := True
Return
^e::
ChordIsBroken := False
Input, OutputVar, L1 M
If (!ChordIsBroken && Asc(OutputVar) = 3)
{
MsgBox "Hello, World!"
}
Else
{
SendInput %OutputVar%
}
Return
Zur Anpassung dies Shiftstatt Ctrl, dann würden Sie die ersetzen müssen Ctrls, entfernen Sie das M, und machen Sie einen einfacheren Vergleich wie OutputVar = Cstatt der Asc(OutputVar) = 3. Nicht sicher , wie dies zu erweitern , um Altund Winaber Sie könnten versuchen müssen , L2oder etwas ähnliches.
Erläuterung
Inputschien ein naheliegender Ort zu sein, um anzufangen. Inputfordert AHK auf, auf Benutzereingaben zu warten, z
^e::
Input, OutputVar, L1 ; "L1" means wait for 1 keystroke then continue.
If (OutputVar = "c")
{
MsgBox, "Hello, World!"
}
Return
Das Meldungsfeld über Trigger auf CtrlEdann C. Aber wir suchen CtrlC, also lassen Sie uns das beheben:
^e::
Input, OutputVar, L1 M ; "M" allows storage of modified keystrokes (^c).
If (Asc(OutputVar) = 3) ; ASCII character 3 is ^c.
{
MsgBox "Hello, World!"
}
Return
Jetzt haben wir ein Meldungsfeld auf drücken bekommen CtrlEdann CtrlC. Aber es gibt ein Problem damit: Das Meldungsfeld wird ausgelöst, selbst wenn ich zwischen den beiden Tastenanschlägen loslasse Ctrl . Wie erkennen wir also im Wesentlichen einen {Ctrl Up}Mid-Input? Sie können nicht nur am Eingang nachsehen -
^e::
if (!GetKeyState("Ctrl"))
{
Return
}
Input, OutputVar, L1 M
; ...
- oder können Sie nicht nur nach der Eingabe überprüfen -
^e::
Input, OutputVar, L1 M
if (!GetKeyState("Ctrl"))
{
Return
}
; ...
- Sie können nicht einmal mit beidem davonkommen, denn egal was passiert, Sie werden die {Ctrl Up}Blockierung für die Eingabe verpassen .
Dann habe ich mich in der DokumentationHotkey nach Inspiration umgesehen. Der benutzerdefinierte Kombinationsoperator &schien vielversprechend. Aber leider,
^e & ^c::
; ...
verursachte einen Kompilierungsfehler; Anscheinend dient das &nur zum Kombinieren von unveränderten Tastenanschlägen.
Schließlich war es an UP, und dort habe ich endlich den Durchbruch geschafft. Ich habe Ctrl's neu definiert , UPum einen Umschalter zu setzen , der verhindert, dass das Meldungsfeld ausgelöst wird!
$Ctrl::Send {Ctrl Down} ; The $ prevents an infinite loop. Although this
$Ctrl UP:: ; line seems redundant, it is in fact necessary.
ChordIsBroken := True ; Without it, Ctrl becomes effectively disabled.
Send {Ctrl Up}
Return
^e::
ChordIsBroken := False
Input, OutputVar, L1 M
If (!ChordIsBroken && Asc(OutputVar) = 3)
{
MsgBox "Hello, World!"
}
Return
Wenn ich jetzt drücke CtrlE, dann loslasse Ctrlund drücke CtrlC, passiert wie erwartet nichts!
Es gab noch eine letzte Sache zu beheben. Bei "Stornierung" (ein "gebrochener Akkord") wollte ich, dass alle Tastenanschläge wieder normal sind. Aber im obigen Code Inputmüsste der einen Tastenanschlag "essen", bevor er zurückkehrt, unabhängig von einem gebrochenen Akkord oder einem irrelevanten sekundären Tastenanschlag. Durch Hinzufügen eines ElseFalls wird das Problem behoben:
Else
{
SendInput %OutputVar%
}
Da haben Sie es also - "Akkorde" in AutoHotkey. (Obwohl ich das nicht gerade als "Akkord" bezeichnen würde. Eher wie eine Melodie mit einer Basslinie ;-)
@hippibruder weist großzügig darauf hin, dass ich das Definieren vermeiden kann, $Ctrl::indem ~ich $Ctrl UP::nicht blockiere. Dies ermöglicht eine gewisse Vereinfachung! (Das endgültige Ergebnis finden Sie oben im Abschnitt tl; dr.)
Eine Sache noch. Wenn Sie möglicherweise bei "Stornierung" (einem "gebrochenen Akkord") den ersten Tastendruck ausgeben möchten, dh CtrlE alleine, fügen Sie diesen einfach in den ElseBlock ein.
Else
{
SendInput ^e
SendInput %OutputVar%
}
und vergessen Sie nicht, den Hotkey in zu ändern
$^e::
eine Endlosschleife zu vermeiden.