Combinación de teclas en keybd_event

Iniciado por gulabyte, 3 Febrero 2009, 02:52 AM

0 Miembros y 1 Visitante están viendo este tema.

gulabyte


kepatxa!!

Resulta que buscando y buscando sobre cómo girar la pantalla con vb he dado con la función keybd_event y he querido aportar lo que he aprendido de él... ;D ;D

La cuestión es que se puede qirar la pantalla usando la combinación de teclas Ctrl+Alt+Flechitas en WinXP y es por eso que necesitaba de keybd_event... pero aparte de brindarte todas las funciones que Windows implementa mediante las combinaciones de teclas (administrador de tareas, dialogo buscar, un gran etc...) la función keybd_event te permite por ejemplo mantener alguna tecla permanentemente...

Yo dejo el código para que se dé rienda suelta al tema... :-X

La gran función keybd_event:
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Algunas constantes..
Const KEYEVENTF_KEYUP = &H2 'Para despulsar o soltar la tecla
Const KEYEVENTF_EXTENDEDKEY = &H1 'No sé lo que es
Const VK_DELETE = &H2E 'Del
Const VK_MENU = &H12 'Alt
Const VK_CONTROL = &H11
Const VK_DOWN = &H28
Const VK_RIGHT = &H27
Const VK_LEFT = &H25
Const VK_UP = &H26


Hay toda una lista de constantes de teclas algún foro chino...bueno por si no sabéis chino...os ayudo :P http://blog.csdn.net/caridle/archive/2007/06/26/1667741.aspx :laugh: :laugh:

un ejemplo: poner pantalla de lado [lo de arriba a la izquierda]
Call keybd_event(VK_CONTROL, 0, 0, 0) 'Pulsar
Call keybd_event(VK_MENU, 0, 0, 0) 'Pulsar
Call keybd_event(VK_LEFT, 0, 0, 0) 'Pulsar
   
Call keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0) 'Soltar
Call keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0) 'Soltar
Call keybd_event(VK_LEFT, 0, KEYEVENTF_KEYUP, 0) 'Soltar


Acordaros de "soltar" la tecla porque sino se puede quedar alguna tecla pulsada y se lía gorda porque las demás teclas pueden funcionar como combinación... :rolleyes: a mi me ha pasao que he puesto VKK_CONTROL (sin Option Explicit) y se me ha quedao la pantalla palla y las teclas paca... estrujando el cerebro para mover bien el ratón y hacer copy&past de VK-UP y ejecutar :laugh:  :¬¬  :laugh: :laugh:

que lo disfruten !! salu10!!  ;)

<[(x)]>

#1
jej.. holas

  Parece muy bueno.
  Probé asíéndolo desde el teclado en mi WinXP SP3 y nada.
  ya te digo si me funciona el code...

<----------------------->
           nada...
<[(x)]>

el_c0c0

Cita de: gulabyte en  3 Febrero 2009, 02:52 AM

kepatxa!!

Resulta que buscando y buscando sobre cómo girar la pantalla con vb he dado con la función keybd_event y he querido aportar lo que he aprendido de él... ;D ;D

La cuestión es que se puede qirar la pantalla usando la combinación de teclas Ctrl+Alt+Flechitas en WinXP y es por eso que necesitaba de keybd_event... pero aparte de brindarte todas las funciones que Windows implementa mediante las combinaciones de teclas (administrador de tareas, dialogo buscar, un gran etc...) la función keybd_event te permite por ejemplo mantener alguna tecla permanentemente...

Yo dejo el código para que se dé rienda suelta al tema... :-X

La gran función keybd_event:
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Algunas constantes..
Const KEYEVENTF_KEYUP = &H2 'Para despulsar o soltar la tecla
Const KEYEVENTF_EXTENDEDKEY = &H1 'No sé lo que es
Const VK_DELETE = &H2E 'Del
Const VK_MENU = &H12 'Alt
Const VK_CONTROL = &H11
Const VK_DOWN = &H28
Const VK_RIGHT = &H27
Const VK_LEFT = &H25
Const VK_UP = &H26


Hay toda una lista de constantes de teclas algún foro chino...bueno por si no sabéis chino...os ayudo :P http://blog.csdn.net/caridle/archive/2007/06/26/1667741.aspx :laugh: :laugh:

un ejemplo: poner pantalla de lado [lo de arriba a la izquierda]
Call keybd_event(VK_CONTROL, 0, 0, 0) 'Pulsar
Call keybd_event(VK_MENU, 0, 0, 0) 'Pulsar
Call keybd_event(VK_LEFT, 0, 0, 0) 'Pulsar
   
Call keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0) 'Soltar
Call keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0) 'Soltar
Call keybd_event(VK_LEFT, 0, KEYEVENTF_KEYUP, 0) 'Soltar


Acordaros de "soltar" la tecla porque sino se puede quedar alguna tecla pulsada y se lía gorda porque las demás teclas pueden funcionar como combinación... :rolleyes: a mi me ha pasao que he puesto VKK_CONTROL (sin Option Explicit) y se me ha quedao la pantalla palla y las teclas paca... estrujando el cerebro para mover bien el ratón y hacer copy&past de VK-UP y ejecutar :laugh:  :¬¬  :laugh: :laugh:

que lo disfruten !! salu10!!  ;)

a mi me adelanta (flecha derecha), o rebobina (flecha izquierda) la cancion del winamp con eso.

seguro que eso funciona asi nomas?, no sera q habilitaste alguna cosa del nVidia control panel?

saludos
'-     coco
"Te voy a romper el orto"- Las hemorroides

Dessa

Hola, es bueno que hayas aprendido a manejar keybd_event, pero creo no es Windows el que gira la pantalla, sino el sofware asociado a los drivers del video, N-videa, ATI, o las On-board de Intel traen esas funciones (que se pueden Habilitar o deshabilitar desde sus propiedades), pero no todos los drivers de videos traen esa funcion y mucho menos  los genéricos de windows  (como trata de explicarte el_c0c0)

Saludos

   
Adrian Desanti

gulabyte


Citara mi me adelanta (flecha derecha), o rebobina (flecha izquierda) la cancion del winamp con eso.

seguro que eso funciona asi nomas?, no sera q habilitaste alguna cosa del nVidia control panel?

saludos

Tengo puesto activar rotación en Intel(R) GMA Driver en el Panel de Control y es eso lo que habilita la combinación de teclas... sino tienes activada la opción deja de funcionar la combinación.

Conclusión: si no tiene el software asociado al driver la opción de girar la pantalla no hay manera de hacerlo... povaya :-\






el_c0c0

#5
Cita de: gulabyte en  3 Febrero 2009, 14:13 PM

Citara mi me adelanta (flecha derecha), o rebobina (flecha izquierda) la cancion del winamp con eso.

seguro que eso funciona asi nomas?, no sera q habilitaste alguna cosa del nVidia control panel?

saludos



Tengo puesto activar rotación en Intel(R) GMA Driver en el Panel de Control y es eso lo que habilita la combinación de teclas... sino tienes activada la opción deja de funcionar la combinación.

Conclusión: si no tiene el software asociado al driver la opción de girar la pantalla no hay manera de hacerlo... povaya :-\







claa, desde el nvidia control panel se puede rotar, pero no me fije si se puede con una convinacion de teclas..

saludos
'-     coco
"Te voy a romper el orto"- Las hemorroides

gulabyte


Me pregunto si no hay alguna API que valga como estándar para comunicarse con los drivers de pantalla, sea ATI, nVidia, Intel o cualquiera... supongo que se enviaran datos medianamente parecidos sea un driver u otro no?? no sé...
En algún lado leí que unos programadores tenían el mismo problema y creo que "depuraban" el panel nVidia añadiendo un breakpoint en la función ChangeDisplaySettingsExW (debe de haber más de uno según termina en A, W...) haber si saltaba. Y decían que saltaba, es decir, que sí que se usaba esa función para girar la pantallla... Intentaré buscar donde vi eso... haber si se puede ver que función usa mi driver...
Todo esto parece muy complejo... no se por qué me da que habrá que saber algo más que VB para profundizar en esto....   ;D ;D

PD: Supongo que se podría analizar que función se llama una vez pulsas ctrl-alt-flecha... :¬¬

salu10!!

gulabyte


He encontrado el foro donde vi eso de debugear el panel de control... el post dice lo siguiente:

CitarHi Mikael,

Thanks for your feedback.

The output means that the first two graphic device/driver does not support
rotation operation from Windows. I suspect the manufacturer's control panel
application uses undocumented interface to talk to their drivers to get it
done without using standard ChangeDisplaySettingsEx. To verify this, you
may use windbg to attach your manufacturer's control panel application
process, and set a breakpoint to ChangeDisplaySettingsEx, like this:

0:000> bp USER32!ChangeDisplaySettingsW
0:000> bp USER32!ChangeDisplaySettingsA
0:000> bp USER32!ChangeDisplaySettingsExW
0:000> bp USER32!ChangeDisplaySettingsExA

We set the breakpoints for all entrypoints for ChangeDisplaySettings* APIs.
Then, you may try to rotate the screen with the control panel application.
If the debugger does not break, it means your application does not use
ChangeDisplaySettings* APIs. Note: some manufacturer's control panel
applications may IPC to another worker process to call
ChangeDisplaySettings*, so you may try this for all the possible processes
used by control panel application.

Thanks.

Best regards,
Jeffrey Tan
Microsoft Online Community Support
=========================================
Delighting our customers is our #1 priority. We welcome your comments and
suggestions about how we can improve the support we provide to you. Please
feel free to let my manager know what you think of the level of service
provided. You can send feedback directly to my manager at:
msdnmg@microsoft.com.

This posting is provided "AS IS" with no warranties, and confers no rights.

undocumented interface to talk to their drivers.... que rollo tienen los manufacturers esos no¿¿ :(
Pero luego dice que le salta el ChangeDispllaySettingsEx...
Ahí mencionan el "windbg", sabe álguien cómo usarlo??

salu10!!

PC (Por Cierto): El foro de donde saque el post es éste http://www.relatedterms.com/ViewThread.aspx?t=799094 y profundizan bastante en el tema pero está en english...  ;D ;D


gulabyte


Nada al final parece que aunque se usa la función ChangeDisplaySettingsExW no es esta la función que realiza la rotación sino otra que es especifica del driver.... en este caso una API de Intel.... :(

Según dicen se puede girar la pantalla con ChangeDisplaySettings siempre que EnumDisplaySettingsEx diga que es compatible...

salu10!!