¿Por qué Visual Studio detecta eventos clave antes de autohotkey?


82

Recientemente cambié a la distribución del teclado Dvorak como un pequeño experimento. Una de las partes más difíciles de la transición ha sido lidiar con las teclas de acceso rápido. La mayoría de las teclas de acceso rápido están diseñadas con QWERTY en mente y, para empeorar las cosas, las teclas de acceso rápido parecen estar extremadamente limitadas a la memoria muscular.

En lugar de volver a aprender todas las teclas de acceso rápido, he escrito un guión para traducir la autohotkey Dvorak Estirada de Espalda a QWERTY cuando el Ctrl, Alt, o Winse pulsan las teclas en combinación con otras teclas. Funciona maravillosamente en todos los lugares que he probado, excepto Visual Studio '08. Parece que las pulsaciones de teclas se detectan antes de que autohotkey pueda traducirlas.

¿Por qué sucede esto y cómo lo soluciono?

A continuación se muestra un extracto (desde el principio) de mi guión:

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

Actualización: el script funciona bien en Win7 con ahk, vs08 y coderush recién instalados. La máquina con la que tengo problemas está ejecutando Vista. ¿Alguna idea sobre cómo diagnosticar más?

Actualización 2: El script funciona bien con Vista y 2010 beta 2. Parece ser algo con solo vs 08 + vista. Probaré una nueva instalación de vs08 esta noche.

Respuestas:


175

¡Ajá! Lo he descubierto. Si ahk y la aplicación de destino no se ejecutan con los mismos privilegios (o usuario), ahk no interceptará / simulará correctamente los eventos del teclado. En mi caso, Visual Studio se ejecutó con privilegios de administrador (elevados) mientras que el script ahk se ejecutó como el usuario actualmente conectado.

Cualquiera de los siguientes solucionó el problema:

  • Ejecutando vs y ahk como usuario actual
  • Compilar el script y ejecutar tanto vs como la aplicación compilada como administrador

15
Solo quería agregar que no se trata de permisos diferentes . Pero, en cambio, el hecho de que un script de AutoHotkey no funcionará en una aplicación que se esté ejecutando con un nivel de privilegios superior al del script. Vea mi respuesta a continuación.
Himanshu P

2
Puede agregar "Ejecutar como administrador" al menú contextual de ahk. Guarda un paso de compilación. howtogeek.com/howto/windows-vista/…
Adam Bell

He encontrado aquí una forma más limpia de ejecutar el script AutoHotkey como administrador en cada inicio sin la intervención del usuario mediante el Programador de tareas: autohotkey.com/boards/viewtopic.php?t=21434
Jose Antonio

Saludos por eso🙏
illusion466

48

Solo quiero agregar un par de puntos a la solución encontrada por el propio OP.

1) El problema no es que AHK y VS se ejecuten con diferentes permisos; es solo que las teclas de acceso rápido creadas por un script que se ejecuta en un modo no administrador no funcionarían en aplicaciones que se ejecutan en el modo de administración , pero no habría ningún problema si se al revés.

2) No es necesario compilar el script necesariamente, solo configure autohotkey.exe para que se ejecute en el modo de administrador (eso es lo que hago), o alternativamente, cree un acceso directo al script en particular y configúrelo para que se ejecute siempre en modo de administrador. (por cierto, solo para señalar, no hay ganancia de rendimiento al ejecutar una versión compilada de un script AHK, porque el código aún se interpreta, es solo que ahora el intérprete está incrustado en el ejecutable creado)


2

Esto se debe a una función de seguridad llamada Aislamiento de privilegios de interfaz de usuario (UIPI) , que forma parte del Control de cuentas de usuario (UAC).

Hay varias soluciones alternativas enumeradas en las preguntas frecuentes:

¿Cómo soluciono los problemas causados ​​por el Control de cuentas de usuario (UAC)?

Las soluciones alternativas comunes son las siguientes:

  • Habilite la opción Agregar 'Ejecutar con acceso a la interfaz de usuario' a los menús contextuales en la configuración de AutoHotkey. Esta opción se puede activar o desactivar sin reinstalar AutoHotkey volviendo a ejecutar AutoHotkey Setup desde el menú Inicio. Una vez que esté habilitado, inicie su archivo de script haciendo clic derecho en él y seleccionando Ejecutar con UI Access , o use una línea de comando como "AutoHotkeyU32_UIA.exe" "Your script.ahk"(pero incluya rutas completas).
  • Ejecute el script como administrador. Tenga en cuenta que esto también hace que cualquier programa iniciado por el script se ejecute como administrador y puede requerir que el usuario acepte una solicitud de aprobación al iniciar el script.
  • Desactive la política de seguridad local "Ejecutar a todos los administradores en el modo de aprobación de administrador" (no recomendado).
  • Desactive UAC por completo. Esto no se recomienda y no es factible en Windows 8 o posterior.

En general, no recomiendo ejecutar un script como administrador para solucionar este problema, ya que tiene efectos secundarios que pueden ser inesperados o no deseados. Por ejemplo, cualquier programa con el que se inicie el script Runtambién se ejecutará como administrador. El script también tendrá permisos de escritura innecesarios para varias carpetas, como Archivos de programa. Un poco de código incorrecto (código malicioso copiado y pegado desde algún lugar o código con un error) podría causar más daño de esta manera.

Por supuesto, tampoco recomiendo las dos últimas opciones. Eso deja solo Run with UI Access , que se puede habilitar y usar como se describe anteriormente.


0

Aparentemente, existe una solución para esto.

De la documentación Program.htm # Installer_uiAccess .
Hilo del foro por Lexikos

Extracto:

EnableUIAccess

Modifica AutoHotkey.exe para permitir que los scripts hagan lo siguiente incluso cuando UAC está habilitado:

Interactúe con ventanas de programas administrativos sin ejecutar el script como administrador. Utilice SendPlay. Hay limitaciones; lea la publicación antes de usar este script.

El enlace de descarga al archivo ahk está roto en el foro pero lo encontré en Github: EnableUIAccess.ahk


¿Por qué está mirando EnableUIAccess.ahk? Es obsoleto. La documentación a la que se vinculó le informa sobre la opción integrada en el instalador de AutoHotkey. El instalador contiene todo lo que necesita. (También he publicado más detalles como respuesta).
Lexikos
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.