2009-12-11 9 views
63

Ich habe vor kurzem auf die Dvorak-Tastatur-Layout als ein bisschen ein Experiment umgeschaltet. Einer der schwierigsten Teile des Übergangs war der Umgang mit Hot-Keys. Die meisten Hot-Keys sind im Hinblick auf QWERTY konzipiert und, um die Sache noch schlimmer zu machen, scheinen Hot-Keys extrem Muskelgedächtnis gebunden zu sein.Warum erkennt Visual Studio wichtige Ereignisse vor autohotkey?

vielmehr all Hot-Keys als neu lernen, habe ich einen autohotkey Skript geschrieben, um das Dvorak-Layout zurück zu QWERTY zu übersetzen, wenn die Ctrl, Alt oder Win Tasten in Verbindung mit anderen Tasten gedrückt werden . Es funktioniert wunderbar überall, außer Visual Studio '08. Es scheint, dass Tastenanschläge abgefangen werden, bevor autohotkey sie übersetzen kann.

Warum passiert das und wie kann ich das beheben?

Es folgt ein Auszug (von Anfang an) von meinem Skript:

; control + letter 
^;::^z 
^q::^x 
^j::^c 
^k::^v 

Update: Das Skript auf Win7 mit ahk, VS08 und CodeRush frisch installierten gut funktioniert. Die Maschine, mit der ich Probleme habe, läuft Vista. Irgendwelche Gedanken darüber, wie man weiter diagnostiziert?

Update 2: Das Skript funktioniert gut mit Vista und 2010 Beta 2. Scheint etwas mit nur vs 08 + Vista zu sein. Ich werde heute Abend eine neue Installation von vs08 ausprobieren.

Antwort

131

Aha! Ich habe es herausgefunden. Wenn ahk und die Ziel-App nicht unter den gleichen Berechtigungen (oder Benutzer) ausgeführt werden, wird ahk Tastaturereignisse nicht richtig abfangen/simulieren. In meinem Fall wurde Visual Studio mit Administratorrechten (erhöht) ausgeführt, während das ahk-Skript als der aktuell angemeldete Benutzer ausgeführt wurde.

Entweder der folgenden löste das Problem:

  • beide Lauf vs und ahk als der aktuelle Benutzer
  • das Skript kompilieren und beide laufen vs und die kompilierte App als Administrator
+3

Kompilieren und Ausführen als Admin funktionierte perfekt! – MEMark

+12

wollte nur hinzufügen, dass es nicht über * verschiedene * Berechtigungen. Aber stattdessen die Tatsache, dass ein AutoHotkey-Skript nicht auf einer Anwendung, die auf einer * höheren * Berechtigungsebene ausgeführt wird als das Skript. Siehe meine Antwort unten. –

+1

Sie können "Run as Admin" im Kontextmenü für ahk hinzufügen. Es speichert einen Kompilierungsschritt. http://www.howtogeek.com/howto/windows-vista/add-run -als-Administrator-für-Autohotkey-Skripte-in-Windows-Vista / –

0

Dieser Satz in den small print klingt relevant:

Wenn Sendmode im automatischen Ausführungsbereich (oberer Teil des Skripts) verwendet wird, es alle Neuzuordnungen auswirkt. Da die Neuzuweisung Send {Blind} verwendet und der SendPlay-Modus {Blind} nicht vollständig unterstützt, funktionieren einige Neuzuordnungen im SendPlay-Modus (, insbesondere Control, Shift, Alt und Win) möglicherweise nicht einwandfrei. Um dies zu umgehen, vermeiden Sie SendPlay in der automatischen Ausführung, wenn Sie Remappings haben; Verwenden Sie dann den Befehl SendPlay vs. Send an anderen Stellen im Skript. Alternativ können Sie Ihre Neuzuordnungen in Hotkeys (wie unten beschrieben) übersetzen, die explizit SendEvent vs. Send aufrufen.

+0

Skript in einem der vier "Senden" -Modi hilft nicht. :( –

37

Nur möchte ein paar Punkte zur Lösung hinzufügen, die vom OP selbst gefunden wurde.

1) Das Problem ist nicht mit AHK und VS mit verschiedenen Berechtigungen laufen - es ist nur, dass durch ein Skript erstellt Hotkeys in einem Nicht-Admin Modus läuft im Admin nicht auf Anwendungen funktionieren wurde, laufen Modus, aber es wäre kein Problem, wenn es umgekehrt ist.

2) Es gibt keine Notwendigkeit, das Skript unbedingt zu kompilieren, nur autohotkey.exe im Admin-Modus (das ist, was ich tue), oder alternativ erstellen Sie eine Verknüpfung zu dem bestimmten Skript und setzen Sie es immer zu laufen Admin-Modus. (Übrigens, es gibt keinen Leistungsgewinn durch das Ausführen einer kompilierten Version eines AHK - Skripts, da der Code immer noch interpretiert wird - nur dass jetzt der Interpreter in die erstellte ausführbare Datei eingebettet ist)