Tengo que escribir una API C# para registrar teclas rápidas globales. Para recibir el mensaje WM_HOTKEY, uso un System.Windows.Forms.NativeWindow
y ejecuto un bucle de mensaje propio con System.Windows.Forms.Application.Run(ApplicationContext)
. Cuando el usuario desea registrar una tecla de acceso directo, debe ejecutar un método llamado RegisterHotkey()
que detiene el ciclo de mensajes con System.Windows.Forms.ApplicationContext.ExitThread()
, registra la tecla de acceso directo con la función RegisterHotKey()
(P/Invocar) y vuelve a iniciar el ciclo de mensajes. Esto es necesario, porque RegisterHotKey()
debe llamarse dentro del mismo hilo que creó la ventana, que nuevamente debe ser instanciado dentro del mismo hilo que ejecuta el ciclo de mensajes.C# - Esperando el bucle de mensajes de WinForms
El problema es que si el usuario llama al método RegisterHotkey()
poco después de comenzar el hilo que se está ejecutando el bucle de mensajes, ApplicationContext.ExitThread()
es llamado antes Application.Run(ApplicationContext)
y por lo tanto los bloques de aplicación de forma indefinida. ¿Alguien conoce un enfoque para esperar a que se inicie un ciclo de mensajes?
¡Gracias de antemano!
Esto no tiene mucho sentido. Simplemente llame a RegisterHotkey() * antes * de que inicie el ciclo del mensaje. Además, se requiere una ventana real, debe tener un identificador válido. –
Como no quiero iniciar un bucle de mensaje por tecla de acceso rápido, tengo que detener y reiniciar el existente para llamar a RegisterHotKey() dentro del mismo hilo. Y dado que mi código funciona, no creo que necesite una ventana real, el identificador válido lo crea 'NativeWindow.CreateHandle (CreateParams)' en su lugar. –