Hola
Vaya, para empezar, algo hacía mal... Intentaba capturar $WM_USER y tengo que capturar $WM_KEYDOWN en GuiRegisterMsg().
He estado mirando el apéndice de mensajes de windows en la ayuda de autoit, pero no hay explicación de qué es cada uno, aunque más o menos se entiende que son...
Por lo que he podido leer hasta ahora, esta forma de detectar si la pulsación es virtual o física, podría ser efectiva:
[ul]
http://winapi.conclase.net/curso/?cap=034 [/ul]
Por lo que pone ahí, parece que podría comprobarse si se trata de una pulsación física, en el parámetro lParam, pues entre otras cosas, da información sobre el código de escaneo, que es relativo a la capa física del teclado.
No lo pone en esa página, pero imagino, que si no se ha pulsado la tecla físicamente, valdrá 0 o algún valor de error..., y con eso podría hacerse la distinción entre tecla simulada y pulsada.
Pero si como dices y parece que es, no funciona, se va a complicar bastante el tema.
He hecho algo como esto:
Código: Seleccionar todo
;Código original de Chefito:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <SendMessage.au3>
Local $hGUI, $nButton2, $GUIMsg
$hGUI = GUICreate("MI GUI", 300, 200)
$nButton2 = GUICtrlCreateButton("SENDMESSAGE", 90, 110, 120, 30)
GUIRegisterMsg($WM_KEYDOWN, "WM_KEYDOWN")
GUISetState()
While 1
$GUIMsg = GUIGetMsg()
Switch $GUIMsg
Case $GUI_EVENT_CLOSE
ExitLoop
Case $nButton2
;_SendMessage($hGUI, $WM_USER, -1, 0)
Send("{enter}")
EndSwitch
WEnd
Func WM_KEYDOWN($hWnd, $Msg, $wParam, $lParam)
ConsoleWrite($wParam ","& $lparam & @cr)
Return $GUI_RUNDEFMSG
EndFunc
que debería recibir la tecla enter al pulsar sobre el botón, y nada, ¡ni se inmuta!.
Si quitáramos
para que esperara que se pulsara cualquier tecla, tampoco funcionaría al pulsar una tecla cualquiera.
Efectivamente, tienes razón;
al quitar el botón de la gui, el mismo código (anulando el case que comprueba si fue pulsado y el envío de la tecla enter), funciona perfecto.
Al pulsar la barra espaciadora obtengo:
$wParam=0x00000020
y
$lParam=0x00390001
Lo qué, como bien dice la página que puse más arriba, $wParam devuelve el código virtual de la tecla pulsada (el espacio tiene asignado el 20) como podemos ver en lo que he obtenido al pulsarlo.
Faltaría pues, entender $lParam, que va a ser más difícil.
Según la web que puse arriba, puede hacerse una estructura para obtener más fácilmente los datos:
Podemos crear un campo de bits para tratar estos datos más fácilmente:
Código: Seleccionar todo
typedef union {
struct {
unsigned int repeticion:16;
unsigned int scan:8;
unsigned int extendida:1;
unsigned int reservado:4;
unsigned int contexto:1;
unsigned int previo:1;
unsigned int transicion:1;
};
unsigned int lParam;
} keyData;
De C ando pegadísimo, pero supongo que esto es una estructura que podría hacerse en autoit con DllStructCreate()...
De todas formas, no se como seguir a partir de ahí, una vez creada la estructura, habría que ver el ejemplo de esa página.
Puf, que lástima que ahora no funcione la página inglesa de AutoIt, dicen que están haciendo backup y mantenimiento y no se puede acceder al foro, para buscar algo de todo esto.
Para solucionar el bug (creo que lo es) de que WM_KEYDOWN no funciona habiendo controles en la gui
se me ocurre una cosilla, que voy a probar y os cuento ¡a ver si puedo daros una sorpresa! :).
--------
Se trataba de crear una ventana padre oculta sin controles, que recibiera los mensajes del teclado y pasárselos a una ventana hija que tuviera los controles, pero no puede funcionar, porque el mensaje se envía a la ventana activa...
Quizá, con una ventana padre transparente o algo así, pero la chapuza es descomunal :).
Salu2!