Dlaczego visual studio łapie kluczowe wydarzenia przed autohotkey?

Niedawno przełączyłem się na układ klawiatury Dvoraka jako mały eksperyment. Jedną z najtrudniejszych części przejścia było radzenie sobie z klawiszami skrótów klawiszowych. Większość skrótów klawiszowych jest zaprojektowana z myślą o QWERTY i, co gorsza, skróty klawiaturowe wydają się być bardzo związane z pamięcią.

Zamiast ponownie uczyć się wszystkich skrótów klawiszowych, napisałem skrypt autohotkey, aby przetłumaczyć układ Dvoraka z powrotem na QWERTY, gdy Ctrl, klawisze Alt lub Win są wciśnięte w połączeniu z innymi kluczami. Działa pięknie wszędzie, gdzie próbowałem, z wyjątkiem Visual Studio '08. Wygląda na to, że naciśnięcia klawiszy są przechwytywane, zanim autohotkey będzie mógł je przetłumaczyć.

Dlaczego tak się dzieje i jak to naprawić?

Poniżej fragment (od początku) mojego skryptu:

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

Update: skrypt działa dobrze na Win7 z ahk, vs08 i coderush świeżo zainstalowany. Maszyna, z którą mam problem, uruchamia Vistę. Wszelkie przemyślenia, jak dalej zdiagnozować?

Update 2: skrypt działa dobrze z Vista i 2010 beta 2. Wydaje się być coś z tylko vs 08 + vista. Spróbuję dziś zainstalować nową wersję vs08.

Author: Rody Oldenhuis, 2009-12-11

4 answers

Aha! Rozgryzłem to. Jeśli ahk i aplikacja docelowa nie działają pod tymi samymi uprawnieniami (lub użytkownikami), ahk nie będzie prawidłowo przechwytywać / symulować zdarzeń klawiatury. W moim przypadku visual studio było uruchamiane z uprawnieniami administratora (podwyższonymi), podczas gdy skrypt ahk był uruchamiany jako aktualnie zalogowany użytkownik.

Jeden z poniższych rozwiązał problem:

  • uruchamianie zarówno vs jak i ahk jako bieżący użytkownik
  • Kompilowanie skryptu i uruchamianie zarówno vs jak i skompilowanej aplikacji jako administrator
 141
Author: Dane O'Connor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-15 04:58:48

Chcę tylko dodać kilka punktów do rozwiązania znalezionego przez samego OP.

1) problem nie polega na tym, że AHK i VS działają z różnymi uprawnieniami - chodzi tylko o to, że skróty utworzone przez skrypt działający w trybie non-admin nie będą działać na aplikacjach działających w trybie admin , ale nie będzie problemu, jeśli jest odwrotnie.

2) nie ma potrzeby kompilowania skryptu, wystarczy ustawić autohotkey.exe do uruchomienia w trybie admin (to właśnie robię), lub alternatywnie utworzyć skrót do konkretnego skryptu i ustawić go, aby zawsze działał w trybie admin. (btw, dla przypomnienia, nie ma zwiększenia wydajności poprzez uruchomienie skompilowanej wersji skryptu AHK, ponieważ kod jest nadal interpretowany-to tylko, że teraz interpreter jest osadzony w utworzonym pliku wykonywalnym)

 39
Author: Himanshu P,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-18 18:50:23

Ta fraza w małym drukiem brzmi trafnie:

Jeśli sendmode jest używany w sekcji auto-execute (górna część skryptu), ma to wpływ na wszystkie poprawki. Jednakże, ponieważ remapowanie używa Send {Blind} i ponieważ tryb SendPlay nie obsługuje w pełni {Blind}, niektóre remapowania mogą nie działać poprawnie w trybie SendPlay (szczególnie Control, Shift, Alt i Win). Aby to obejść, unikaj SendPlay w sekcji auto-execute, gdy masz remappingi; następnie użyj polecenie SendPlay vs. Send w innych miejscach w całym skrypcie. Alternatywnie, możesz przetłumaczyć swoje remappingi na skróty klawiszowe (jak opisano poniżej), które jawnie wywołują SendEvent vs.Send.

 0
Author: Hans Passant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-11 19:58:18

Najwyraźniej istnieje obejście tego problemu.

Z programu docs .htm#Installer_uiAccess.
wątek na Forum by Lexikos

Fragment:

EnableUIAccess

Modyfikuje AutoHotkey.exe pozwala skryptom wykonywać następujące czynności, nawet gdy UAC jest włączony:

Interakcja z oknami programów administracyjnych bez uruchamiania skryptu jako administrator. Użyj SendPlay. Są ograniczenia; proszę przeczytać post przed użyciem tego skryptu.

Link do pliku ahk jest zepsuty na forum, ale znalazłem go na Githubie: EnableUIAccess.ahk

 0
Author: Laoujin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-01 18:48:59