Warum erfasst Visual Studio wichtige Ereignisse vor dem Autohotkey?

82

Ich habe kürzlich als Experiment zum Dvorak-Tastaturlayout gewechselt. Einer der schwierigsten Teile des Übergangs war der Umgang mit Tastenkombinationen. Die meisten Hotkeys wurden unter Berücksichtigung von QWERTZ entwickelt. Um die Sache noch schlimmer zu machen, scheinen Hotkeys extrem an das Muskelgedächtnis gebunden zu sein.

Anstatt Neulern all Hot-Keys, habe ich ein autohotkey Skript geschrieben die Dvorak - Layout zurück zu QWERTY zu übersetzen , wenn das Ctrl, Alt, oder WinTasten in Verbindung mit anderen Tasten gedrückt werden. Es funktioniert überall dort wunderbar, wo ich es versucht habe, außer in Visual Studio '08. Es scheint, dass Tastenanschläge abgefangen werden, bevor der Autohotkey sie übersetzen kann.

Warum passiert das und wie behebe ich das?

Unten ist ein Auszug (von Anfang an) meines Skripts:

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

Update: Das Skript funktioniert unter Win7 mit ahk, vs08 und frisch installiertem Coderush einwandfrei. Auf der Maschine, mit der ich Probleme habe, läuft Vista. Irgendwelche Gedanken zur weiteren Diagnose?

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 Neuinstallation von vs08 versuchen.

Däne O'Connor
quelle

Antworten:

173

Aha! Ich habe es herausgefunden. Wenn ahk und die Ziel-App nicht unter denselben Berechtigungen (oder Benutzern) ausgeführt werden, kann ahk Tastaturereignisse nicht ordnungsgemäß abfangen / simulieren. In meinem Fall wurde Visual Studio mit Administratorrechten (erhöhten Berechtigungen) ausgeführt, während das ahk-Skript als aktuell angemeldeter Benutzer ausgeführt wurde.

Eine der folgenden Lösungen hat das Problem gelöst:

  • Ausführen von vs und ahk als aktueller Benutzer
  • Kompilieren des Skripts und Ausführen von vs und der kompilierten App als Administrator
Däne O'Connor
quelle
15
Ich wollte nur hinzufügen, dass es nicht um unterschiedliche Berechtigungen geht. Stattdessen funktioniert die Tatsache, dass ein AutoHotkey-Skript nicht für eine Anwendung funktioniert, die mit einer höheren Berechtigungsstufe als das Skript ausgeführt wird. Siehe meine Antwort unten.
Himanshu P
2
Sie können dem Kontextmenü für ahk "Als Administrator ausführen" hinzufügen. Es speichert einen Kompilierungsschritt. howtogeek.com/howto/windows-vista/…
Adam Bell
Ich habe hier eine sauberere Möglichkeit gefunden, das AutoHotkey-Skript als Administrator bei jedem Start ohne Benutzereingriff mithilfe des Taskplaners auszuführen
Jose Antonio
Prost dafür
illusion466
48

Ich möchte nur ein paar Punkte zur Lösung hinzufügen, die das OP selbst gefunden hat.

1) Das Problem besteht nicht darin, dass AHK und VS mit unterschiedlichen Berechtigungen ausgeführt werden. Es ist nur so, dass Hotkeys, die von einem Skript erstellt wurden, das in einem Nicht-Administratormodus ausgeführt wird, bei Anwendungen, die im Administratormodus ausgeführt werden, nicht funktionieren , aber es gibt kein Problem, wenn dies der Fall ist andersherum.

2) Das Skript muss nicht unbedingt kompiliert werden. Setzen Sie einfach autohotkey.exe so, dass es im Admin-Modus ausgeführt wird (das mache ich), oder erstellen Sie alternativ eine Verknüpfung zu dem jeweiligen Skript und stellen Sie es so ein, dass es immer im Admin-Modus ausgeführt wird. (Übrigens gibt es keinen Leistungsgewinn, wenn eine kompilierte Version eines AHK-Skripts ausgeführt wird, da der Code immer noch interpretiert wird - nur dass der Interpreter jetzt in die erstellte ausführbare Datei eingebettet ist.)

Himanshu P.
quelle
2

Dies ist auf eine Sicherheitsfunktion namens UIPI (User Interface Privilege Isolation) zurückzuführen , die Teil der Benutzerkontensteuerung (User Account Control, UAC) ist.

In den FAQ sind mehrere Problemumgehungen aufgeführt:

Wie kann ich Probleme umgehen, die durch die Benutzerkontensteuerung (User Account Control, UAC) verursacht werden?

Übliche Problemumgehungen sind:

  • Aktivieren Sie im AutoHotkey-Setup die Option "Mit UI-Zugriff ausführen" zu Kontextmenüs hinzufügen. Diese Option kann aktiviert oder deaktiviert werden, ohne AutoHotkey neu zu installieren, indem AutoHotkey Setup über das Startmenü erneut ausgeführt wird. Sobald es aktiviert ist, starten Sie Ihre Skriptdatei, indem Sie mit der rechten Maustaste darauf klicken und Mit UI-Zugriff ausführen auswählen , oder verwenden Sie eine Befehlszeile wie "AutoHotkeyU32_UIA.exe" "Your script.ahk"(aber schließen Sie vollständige Pfade ein).
  • Führen Sie das Skript als Administrator aus. Beachten Sie, dass dies auch dazu führt, dass vom Skript gestartete Programme als Administrator ausgeführt werden und der Benutzer möglicherweise beim Starten des Skripts eine Genehmigungsaufforderung akzeptieren muss.
  • Deaktivieren Sie die lokale Sicherheitsrichtlinie "Alle Administratoren im Administratorgenehmigungsmodus ausführen" (nicht empfohlen).
  • Deaktivieren Sie die Benutzerkontensteuerung vollständig. Dies wird nicht empfohlen und ist unter Windows 8 oder höher nicht möglich.

Ich empfehle im Allgemeinen nicht, ein Skript als Administrator auszuführen, um dieses Problem zu umgehen, da es Nebenwirkungen hat, die unerwartet oder unerwünscht sein können. Beispielsweise wird jedes Programm, mit dem das Skript gestartet Runwird, auch als Administrator ausgeführt. Das Skript verfügt außerdem über unnötige Schreibrechte für verschiedene Ordner, z. B. Programmdateien. Ein bisschen schlechter Code (bösartiger Code, der von irgendwoher kopiert wurde, oder Code mit einem Fehler) könnte auf diese Weise mehr Schaden anrichten.

Natürlich empfehle ich auch die letzten beiden Optionen nicht. Damit bleibt nur Run with UI Access übrig , das wie oben beschrieben aktiviert und verwendet werden kann.

Lexikos
quelle
0

Anscheinend gibt es dafür eine Problemumgehung.

Aus der Dokumentation Program.htm # Installer_uiAccess .
Forenthread von Lexikos

Auszug:

EnableUIAccess

Ändert AutoHotkey.exe so, dass Skripte auch bei aktivierter Benutzerkontensteuerung Folgendes ausführen können:

Interagieren Sie mit Fenstern von Verwaltungsprogrammen, ohne das Skript als Administrator auszuführen. Verwenden Sie SendPlay. Es gibt Einschränkungen; Bitte lesen Sie den Beitrag, bevor Sie dieses Skript verwenden.

Der Download-Link zur ahk-Datei ist im Forum defekt, aber ich habe ihn auf Github gefunden: EnableUIAccess.ahk

Laoujin
quelle
Warum schauen Sie sich EnableUIAccess.ahk an? Es ist veraltet. In der Dokumentation, auf die Sie verlinkt haben, finden Sie Informationen zu der im AutoHotkey-Installationsprogramm integrierten Option. Das Installationsprogramm enthält alles, was Sie brauchen. (Ich habe auch mehr Details als Antwort gepostet.)
Lexikos