Quiero capturar el teclado con las apis hooks.
Para ello, como que no controlo mucho estas apis, me he basado en la función _KeyProc() de Chefito de este post:
http://www.emesn.com/autoitforum/viewto ... on+winlist
ya que el primer código que hizo para esto mismo en un post más antiguo no lo encuentro...
Resulta, que todo funciona bien, salvo que es como si recibiera dos veces seguida la misma tecla, por lo que si compruebo con un select/switch si por ejemplo sse ha pulsado la tecla enter y muestro un mensaje con Msgbox(), este se muestra dos veces cada vez que pulso la tecla intro.
el código que he hecho es este:
Código: Seleccionar todo
HotKeySet("{esc}", "ExitFile")
Global $KeyProcRegister, $HMod, $HHook, $Kernel32DLL, $User32DLL
DllStart()
KeyboardHooksStart()
Func KeyboardHooksStart()
$KeyProcRegister=DllCallbackRegister("_KeyProc", "long", "int;wparam;lparam")
If $KeyProcRegister=0 Then Return 0
$HMod=DllCall($Kernel32DLL, "hwnd", "GetModuleHandle", "ptr", 0)
If (Not IsArray($HMod) Or @Error<>0) Then Return 0
$HHook=DllCall($User32DLL, "hwnd", "SetWindowsHookEx", "int", $WH_KEYBOARD_LL, "ptr", DllCallbackGetPtr($KeyProcRegister), "hwnd", $HMod[0], "dword", 0)
If (Not IsArray($HHook) Or @Error<>0) Then Return 0
Return 1
EndFunc
Func _KeyProc($NCode, $WParam, $LParam)
Local $KeyHookStruct, $VKeyCode
$KeyHookStruct=DllStructCreate("dword;dword;dword;dword;ptr", $LParam)
If ($KeyHookStruct=0 And @Error<>0) Then Return _WinAPI_CallNextHookEx($HHook, $NCode, $WParam, $LParam)
$VKeyCode=DllStructGetData($KeyHookStruct, 1)
If ($VKeyCode=0 And @Error<>0) Then Return _WinAPI_CallNextHookEx($HHook, $NCode, $WParam, $LParam)
Select
Case $VKeyCode=13 ;Si se pulsa la tecla "enter"
Msgbox(0, "", "¡Has pulsado la tecla ENTER!")
EndSelect
Return _WinAPI_CallNextHookEx($HHook, $NCode, $WParam, $LParam)
EndFunc
Func DllStart()
$User32DLL=DllOpen("User32.dll")
If $User32DLL=-1 Then Return 0
$Kernel32DLL=DllOpen("Kernel32.dll")
If $Kernel32DLL=-1 Then Return 0
Return 1
EndFunc
Func DllQuit()
$User32DLL=DllClose($User32DLL)
$Kernel32DLL=DllClose($Kernel32DLL)
Return ""
EndFunc
Func ExitFile()
$HHook=DllCall($User32DLL, "int", "UnhookWindowsHookEx", "hwnd", $HHook[0])
DllCallbackFree($KeyProcRegister)
DllQuit()
Exit
EndFunc
While 1
Sleep(10)
Wend
Salu2!