Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: 50l3r en 26 Enero 2010, 23:53 pm



Título: Detectar atajos de teclado
Publicado por: 50l3r en 26 Enero 2010, 23:53 pm
Muy buneas, quisiera saber como detectar atajos de teclado, es decir como saber en mi programa si se ha pulsado alt + f4 por ejemplo

alguien sabe con que funcion se puede hacer? intente con la api getasynckeystate pero me lo detecta unicamente cuando las pulso a la vez, no cuando dejo pulsada,una y despues otra, nose si me entendi bien

saludos


Título: Re: Detectar atajos de teclado
Publicado por: 50l3r en 27 Enero 2010, 00:19 am
weno, me autorespondo

http://www.recursosvisualbasic.com.ar/htm/trucos-codigofuente-visual-basic/10.htm

gracias ^^ xD


Título: Re: Detectar atajos de teclado
Publicado por: seba123neo en 27 Enero 2010, 22:53 pm
es mejor con la api RegisterHotKey, ya que eso solamente funciona si tu aplicación esta activa.


Título: Re: Detectar atajos de teclado
Publicado por: 50l3r en 27 Enero 2010, 23:04 pm
pues lo iva a preguntar ahora mismo, me di cuenta cuando lo acabe que solo recibe la accion si tiene el foco


Título: Re: Detectar atajos de teclado
Publicado por: 50l3r en 31 Enero 2010, 03:58 am
tengo una duda en esto ultimo:

RegisterHotKey(hWnd, 1, MOD_CONTROL, VK_V)

ahi apretando control + v genera el evento

pero si yo quisiera pasarle 3 teclas para un atajo de teclado, por ejemplo control + v + 1

como hago eso?

saludos


Título: Re: Detectar atajos de teclado
Publicado por: seba123neo en 31 Enero 2010, 04:22 am
con un Or vas a agregando mas...por ejemplo CTRL + ALT + 1

Código
  1. If RegisterHotKey(hWnd, 1, MOD_CONTROL Or MOD_ALT, VK_NUMPAD1) = 0 Then

pero fijate que el tercer parametro no podria recibir la tecla "V", mira la documentacion de la api, ahi te explica solo cual pueden ser.

http://msdn.microsoft.com/en-us/library/ms646309%28VS.85%29.aspx (http://msdn.microsoft.com/en-us/library/ms646309%28VS.85%29.aspx)

saludos.







Título: Re: Detectar atajos de teclado
Publicado por: 50l3r en 31 Enero 2010, 13:01 pm
ok muchas gracias

mira tengo otra duda, el proceso para ello es el sigueinte

Código
  1. If RegisterHotKey(hWnd, 1, MOD_CONTROL Or MOD_ALT, VK_1) = 0 Then
  2.    MsgBox " Hubo un error ", vbCritical
  3.    Exit Sub
  4.    End If
  5.    If RegisterHotKey(hWnd, 1, MOD_CONTROL Or MOD_ALT, VK_2) = 0 Then
  6.    MsgBox " Hubo un error ", vbCritical
  7.    Exit Sub
  8.    End If
  9.    If RegisterHotKey(hWnd, 1, MOD_CONTROL Or MOD_ALT, VK_3) = 0 Then
  10.    MsgBox " Hubo un error ", vbCritical
  11.    Exit Sub
  12.    End If
  13.    If RegisterHotKey(hWnd, 1, MOD_CONTROL Or MOD_ALT, VK_4) = 0 Then
  14.    MsgBox " Hubo un error ", vbCritical
  15.    Exit Sub
  16.    End If
  17.    If RegisterHotKey(hWnd, 1, MOD_CONTROL Or MOD_ALT, VK_5) = 0 Then
  18.    MsgBox " Hubo un error ", vbCritical
  19.    Exit Sub
  20.    End If
  21.    If RegisterHotKey(hWnd, 1, MOD_CONTROL Or MOD_ALT, VK_6) = 0 Then
  22.    MsgBox " Hubo un error ", vbCritical
  23.    Exit Sub
  24.    End If
  25.    If RegisterHotKey(hWnd, 1, MOD_CONTROL Or MOD_ALT, VK_7) = 0 Then
  26.    MsgBox " Hubo un error ", vbCritical
  27.    Exit Sub
  28.    End If
  29.    If RegisterHotKey(hWnd, 1, MOD_CONTROL Or MOD_ALT, VK_8) = 0 Then
  30.    MsgBox " Hubo un error ", vbCritical
  31.    Exit Sub
  32.    End If
  33.  
  34.    WinProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf NewWindowProc)
  35.  

y en el modulo es asi:

Código
  1. Public Function NewWindowProc( _
  2.                ByVal hWnd As Long, _
  3.                ByVal Msg As Long, _
  4.                ByVal wParam As Long, _
  5.                ByVal lParam As Long) As Long
  6.  
  7.    If Msg = &H82 Then
  8.  
  9.       Call SetWindowLong(hWnd, GWL_WNDPROC, WinProc)
  10.       Call UnregisterHotKey(hWnd, 1)
  11.  
  12.    End If
  13.  
  14.  
  15.    If Msg = WM_HOTKEY Then
  16.       MsgBox "atajos dados"
  17.    End If
  18.    NewWindowProc = CallWindowProc(WinProc, hWnd, Msg, wParam, lParam)
  19.  
  20. End Function

como hago para identificar si se ha dado a ctrl + alt + 2 en vez  de a ctrl + alt + 7 por ejemplo? ya que para identificarlo usan la constante msg y devuelve unicamente el valor de que se ha ejecutado la pulsacion de teclas, una cualquiera

saludos


Título: Re: Detectar atajos de teclado
Publicado por: raul338 en 31 Enero 2010, 20:00 pm
En el segundo parametro de RegisterHotKey deben ser todos numeros distintos (imagina, es como un handle del Hotkey) y en el sub NewWindowProc en lparam (o wparam si no me equivoco) devuelve el identificador del hotkey presionado (o sea, el segundo parametro del RegisterHotKey)


Título: Re: Detectar atajos de teclado
Publicado por: 50l3r en 31 Enero 2010, 22:01 pm
no te entendi muy bien


Título: Re: Detectar atajos de teclado
Publicado por: Karcrack en 1 Febrero 2010, 00:06 am
Código:
http://msdn.microsoft.com/en-us/library/bb775233(VS.85).aspx
:-*


Título: Re: Detectar atajos de teclado
Publicado por: seba123neo en 1 Febrero 2010, 02:05 am
cada registrada de combinaciones tiene un ID, es el segundo parametro, vos ahi estas registrando todas con el mismo ID = 1 , y cuando repetis los ID, solo te toma la ultima ...debes hacer algo como:

If RegisterHotKey(hWnd, 1, MOD_CONTROL Or MOD_ALT, VK_1) = 0 Then
...codigo...
If RegisterHotKey(hWnd, 2, MOD_CONTROL Or MOD_ALT, VK_1) = 0 Then
codigo...
If RegisterHotKey(hWnd, 3, MOD_CONTROL Or MOD_ALT, VK_1) = 0 Then
codigo....

y en el NewWindowProc el parametro wParam, te va a llegar con el ID de la combinacion que apretaste, y bueno ahi haces un if o un select case y listo...

PD: para desregistrar tambien debes hacerlo con el ID...

saludos.


Título: Re: Detectar atajos de teclado
Publicado por: 50l3r en 1 Febrero 2010, 08:56 am
ok gracias sea123neo, ahora si lo entendi


Título: Re: Detectar atajos de teclado
Publicado por: 50l3r en 1 Febrero 2010, 16:49 pm
esto en el form load:

Código
  1.    If RegisterHotKey(hWnd, 1, MOD_CONTROL Or MOD_ALT, VK_1) = 0 Then
  2.    MsgBox " Hubo un error ", vbCritical
  3.    Exit Sub
  4.    End If
  5.    If RegisterHotKey(hWnd, 2, MOD_CONTROL Or MOD_ALT, VK_2) = 0 Then
  6.    MsgBox " Hubo un error ", vbCritical
  7.    Exit Sub
  8.    End If
  9.    If RegisterHotKey(hWnd, 3, MOD_CONTROL Or MOD_ALT, VK_3) = 0 Then
  10.    MsgBox " Hubo un error ", vbCritical
  11.    Exit Sub
  12.    End If
  13.    If RegisterHotKey(hWnd, 4, MOD_CONTROL Or MOD_ALT, VK_4) = 0 Then
  14.    MsgBox " Hubo un error ", vbCritical
  15.    Exit Sub
  16.    End If
  17.    If RegisterHotKey(hWnd, 5, MOD_CONTROL Or MOD_ALT, VK_5) = 0 Then
  18.    MsgBox " Hubo un error ", vbCritical
  19.    Exit Sub
  20.    End If
  21.    If RegisterHotKey(hWnd, 6, MOD_CONTROL Or MOD_ALT, VK_6) = 0 Then
  22.    MsgBox " Hubo un error ", vbCritical
  23.    Exit Sub
  24.    End If
  25.    If RegisterHotKey(hWnd, 7, MOD_CONTROL Or MOD_ALT, VK_7) = 0 Then
  26.    MsgBox " Hubo un error ", vbCritical
  27.    Exit Sub
  28.    End If
  29.    If RegisterHotKey(hWnd, 8, MOD_CONTROL Or MOD_ALT, VK_8) = 0 Then
  30.    MsgBox " Hubo un error ", vbCritical
  31.    Exit Sub
  32.    End If
  33.  
  34.    WinProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf NewWindowProc)

esto en el modulo:
Código
  1. Public Function NewWindowProc( _
  2.                ByVal hWnd As Long, _
  3.                ByVal Msg As Long, _
  4.                ByVal wParam As Long, _
  5.                ByVal lParam As Long) As Long
  6.  
  7.    If Msg = &H82 Then
  8.  
  9.       Call SetWindowLong(hWnd, GWL_WNDPROC, WinProc)
  10.       Call UnregisterHotKey(hWnd, 1)
  11.  
  12.    End If
  13.  
  14. if wparam = 1 then msgbox "apretaste 1"
  15. if wparam = 2 then msgbox "apretaste 2"
  16. if wparam = 3 then msgbox "apretaste 3"
  17. if wparam = 4 then msgbox "apretaste 4"
  18. if wparam = 5 then msgbox "apretaste 5"
  19. if wparam = 6 then msgbox "apretaste 6"
  20. if wparam = 7 then msgbox "apretaste 7"
  21. if wparam = 8 then msgbox "apretaste 8"
  22.  
  23.  
  24.    NewWindowProc = CallWindowProc(WinProc, hWnd, Msg, wParam, lParam)
  25.  
  26. End Function
  27.  
  28.  


Título: Re: Detectar atajos de teclado
Publicado por: Karcrack en 1 Febrero 2010, 17:23 pm
Utiliza un Select Case envez de tantos Ifs :rolleyes: :rolleyes:


Título: Re: Detectar atajos de teclado
Publicado por: 50l3r en 1 Febrero 2010, 18:16 pm
solo lo puse para ver si funcionaba, no funciona

al iniciar el proyecto se crea un bucle que dice" apretaste1"


Título: Re: Detectar atajos de teclado
Publicado por: raul338 en 1 Febrero 2010, 23:22 pm
es porque no pussite flitro. o sea, todos esos IF tenes que meterlos dentro de un if que valide si Msg es WM_HOTKEY

Código
  1. Public Function NewWindowProc( _
  2.                ByVal hWnd As Long, _
  3.                ByVal Msg As Long, _
  4.                ByVal wParam As Long, _
  5.                ByVal lParam As Long) As Long
  6.  
  7.    If Msg = &H82 Then
  8.  
  9.       Call SetWindowLong(hWnd, GWL_WNDPROC, WinProc)
  10.       Call UnregisterHotKey(hWnd, 1)
  11.  
  12.    End If
  13. if Msg = WM_HOTKEY Then ' Creo que es &H83 si mi memoria no me falla :P
  14. if wparam = 1 then msgbox "apretaste 1"
  15. if wparam = 2 then msgbox "apretaste 2"
  16. if wparam = 3 then msgbox "apretaste 3"
  17. if wparam = 4 then msgbox "apretaste 4"
  18. if wparam = 5 then msgbox "apretaste 5"
  19. if wparam = 6 then msgbox "apretaste 6"
  20. if wparam = 7 then msgbox "apretaste 7"
  21. if wparam = 8 then msgbox "apretaste 8"
  22. end If
  23.  
  24.    NewWindowProc = CallWindowProc(WinProc, hWnd, Msg, wParam, lParam)
  25.  
  26. End Function
  27.  
  28.  
  29. PD: La proxima sere un poco mas claro para que me entiendas mejor :P (x la explicacion de antes :xD)