Saltar al contenido

SendKeys (Enviar combinacion de teclas directamente al buffer del teclado)


verzulsan

Recommended Posts

publicado

SIMULAR SER UN TECLADO :D

Ejecutar combinacion de teclas directamente al buffer del teclado

He pasado un calvario antes de toparme con este magnifico codigo al que se le puede sacar mucho partido. Este post es la respuesta a otro en el que andaba buscando una funcion que insertara las teclas directamente al buffer del teclado, simulando ser una persona que presiona la tecla. Me refiero a que, con esta funcion, ya no hay que ir apuntando a la aplicacion a la que queremos enviar las teclas. Sera exactamente igual que si presionaramos nosotros mismos las teclas en el keyboard, por lo que funcionaran cosas como: ALT+TAB= display aplications, CONTROL+ALT+SUPRIMIR, es decir, cualquier cosa, sin llamada de apis constantes, unicamente una llamada API al buffer del teclado.

Referido del post origen donde comenzo el tema:

https://www.ayudaexcel.com/foro/macros-y-programacion-vba/8193-ejecutar-combinacion-de-teclas-desde-excel-sendkeys-llamada-otros-programas.html

Agrego el codigo, el cual ire depurando hasta que sea comodo de usar en excel:

Const VK_H = 72
Const VK_E = 69
Const VK_L = 76
Const VK_O = 79
Const KEYEVENTF_KEYUP = &H2
Const INPUT_MOUSE = 0
Const INPUT_KEYBOARD = 1
Const INPUT_HARDWARE = 2

Private Type MOUSEINPUT
dx As Long
dy As Long
mouseData As Long
dwFlags As Long
time As Long
dwExtraInfo As Long
End Type

Private Type KEYBDINPUT
wVk As Integer
wScan As Integer
dwFlags As Long
time As Long
dwExtraInfo As Long
End Type

Private Type HARDWAREINPUT
uMsg As Long
wParamL As Integer
wParamH As Integer
End Type

Private Type GENERALINPUT
dwType As Long
xi(0 To 23) As Byte
End Type

Private Declare Function SendInput Lib "user32.dll" (ByVal nInputs As Long, pInputs As GENERALINPUT, ByVal cbSize As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

Private Sub Form_KeyPress(KeyAscii As Integer)
'Print the key on the form
Me.Print Chr$(KeyAscii);
End Sub

Private Sub Form_Paint()
'Clear the form
Me.Cls
'call the SendKey-function
SendKey VK_H
SendKey VK_E
SendKey VK_L
SendKey VK_L
SendKey VK_O
End Sub

Private Sub SendKey(bKey As Byte)
Dim GInput(0 To 1) As GENERALINPUT
Dim KInput As KEYBDINPUT
KInput.wVk = bKey 'the key we're going to press
KInput.dwFlags = 0 'press the key
'copy the structure into the input array's buffer.
GInput(0).dwType = INPUT_KEYBOARD ' keyboard input
CopyMemory GInput(0).xi(0), KInput, Len(KInput)
'do the same as above, but for releasing the key
KInput.wVk = bKey ' the key we're going to realease
KInput.dwFlags = KEYEVENTF_KEYUP ' release the key
GInput(1).dwType = INPUT_KEYBOARD ' keyboard input
CopyMemory GInput(1).xi(0), KInput, Len(KInput)
'send the input now
Call SendInput(2, GInput(0), Len(GInput(0)))
End Sub[/CODE]

Dejare el tema abierto para mostrar los avances y posibles aplicaciones, puesto que veo que se le puede sacar mucho partido a esto.

Un saludo.

publicado

Respuesta: SendKeys (Enviar combinacion de teclas directamente al buffer del teclado)

Saludos!

Me disculpo por poner esta respuesta aqui, pero es que diste como cerrado el tema, por lo cual dedidi escribir aqui!

Veo que toda tu investigación sobre sendkeys... comenzo por que querias llama a macros a las cuales les asignaste una combinacion de teclas si no me equivoco...

Asi que estudiaste sendkeys para ejecutar tus macros...

Probaste el metodo Run del objeto application?

Con el metodo run se puede llamar a una macro, incluso a una que se encuentre en otro libro y hasta se le pueden pasar parametros.

Sub Llamada_macro()
ChDir "C:\" 'me posiciono en el directorio donde esta: libro1.xlsm
Application.Run "Libro1.xlsm!p" 'llamo a la macro p de dicho libro
Workbooks("Libro1.xlsm").Close False ' una vez que se ejecuto cierro libro
End Sub

Obviamente el procedimiento Llamada_macro se encuentra en otro libro.

publicado

Respuesta: SendKeys (Enviar combinacion de teclas directamente al buffer del teclado)

Gracias Digitalboy por la respuesta, no era lo que queria hacer llamar a otra macro de un libro pero este truco de llamar a macros de otros libros no me lo sabia, creo que le podre sacar probecho en futuros proyectos :)

Yo tambien habria interpretado lo de ejecutar macros con macros de excel, pero estos programas de los que hablo, tambien se llaman macros. Son programas que graban pulsaciones de teclado, y movimientos de raton a parte de otras muchas funciones, y luego generan un archivo el cual puede ser accedido mediante pulsacion de teclas, de ahi que quisiera un metodo global para no tener que acceder con FOCUS a la aplicacion cada vez que quisiera hacer una llamada a la macro de ese programa. Con este codigo que pongo arriba esta ya solucionado puesto que intercepta el buffer del teclado y es como si la combinacion la hiciera desde el mismo teclado, asi que se ejecuta la macro sin problemas. Mira te pongo el nombre de alguno de esos programas para que me entiendas mejor:

|| AIM Keys, All-in-One Macro Utility ||

MacroMaker

Macro Scheduler - Descargar

Estos 3 son los que mas uso, todos son macros al igual que las macros del excel.

Un saludo

  • 1 year later...
publicado

Hola Verzulsan... Vengo siguiendo tu respuesta desde el post anterior (de llamar las macros) y hasta ahí había entendido... Pero este código que enviaste en muy complejo para mí... Yo necesito una macro en Excel, asociada a un Click en un Botón, y que simule que presiono F10 desde mi teclado. Este F10 activa un programa (AutoClick) que empieza a ejecutar una rutina. Ya intente con el Application.SendKeys ("{F10}"), pero no funcionó.

Ojala y me puedas echar una mano con esto. Gracias de antemano... Jjpard1

publicado

Hola jjpard,

Te pongo un adjunto con un ejemplo, dentro vienen las explicaciones pero hace lo que quieres, presiona "con el dedo" la tecla F12 del teclado interaccionando con cualquier aplicacion abierta que esté a la espera de una pulsacion de esa tecla. Este metodo suele ser llamado de forma privada, pero para el ejemplo, he puesto publicas las funciones. Los ascii del teclado los puedes encontrar por google facilmente, por ejemplo, lo de los F1 a F12 esta es una pagina de ejemplo:

http://www.velocityreviews.com/forums/t277457-re-ascii-code-for-functions-keys-f1-f12-and-tab-key.html

Saludos

Example_Sendkeys_vzs.zip

  • 1 year later...
publicado

Hola Verzulsan:

Me parece muy interesante tu propuesta. yo quisiera saber si puedo mandar pulsaciones de COPY PASTE desde excel a un programa de ORACLE. Esto me evitaría estar capturando algo que ya tengo en excel. Agradezco de antemano tu gran apoyo.

publicado

yo quisiera saber si puedo mandar pulsaciones de COPY PASTE desde excel a un programa de ORACLE. Esto me evitaría estar capturando algo que ya tengo en excel. Agradezco de antemano tu gran apoyo.

Si no estoy equivocado Oracle es un DBMS por lo cual creo que es mejor conectarte a el por medio de ADO para lo que quieres hacer!

publicado

Hola JAVS13,

Yo de ORACLE no tengo muchos conocimientos, pero me parece buena la sugerencia de digitalboy.

No obstante, si lo que quieres es hacerlo todo por teclado, si que se podría adaptar esto a lo que necesitas, SIEMPRE Y CUANDO, lo que intentas hacer puedas hacerlo manualmente usando solo el teclado y que la tarea sea idéntica en todos los casos.

Saludos

publicado
Hola JAVS13,

Yo de ORACLE no tengo muchos conocimientos, pero me parece buena la sugerencia de digitalboy.

No obstante, si lo que quieres es hacerlo todo por teclado, si que se podría adaptar esto a lo que necesitas, SIEMPRE Y CUANDO, lo que intentas hacer puedas hacerlo manualmente usando solo el teclado y que la tarea sea idéntica en todos los casos.

Saludos

HOLA Verzulsan:

Muchas gracias por tu pronta respuesta. De hecho la rutina sería algo así como:

Primero copia cierta celda del EXCEL, luego un ALT+TAB para irse al un Plantilla del ORACLE y en donde este el cursor PEGA y luego TAB en el mismo ORACLE para que se vaya al siguiente cuadro y después ALT+TAB para que regrese al EXCEL, más un TAB para que se vaya al siguiente registro del mismo EXCEL y otra vez lo copia y asi se lo lleva al ORACLE. en realidad la tarea es copiar registro por registro de EXCEL y pegar registro por registro en ORACLE. Crees que esto se posible ?

De antemano, mil gracias por tu gran apoyo.

publicado

Hola JAVS13,

Échale un vistazo al adjunto a ver si te aclaras con el ejemplo.

Los módulos SendKeyss y z_Add_WaitMS son por llamarlo de alguna forma (las librerías), en el modulo JAVS3 están las rutinas que hacen más o menos lo que querías, el modulo Accesos son solo ejemplos de pruebas que hice en su dia, lo puedes borrar.

En mi equipo, tengo desactivado la animación al minimizar y maximizar ventanas, si quieres hacer lo mismo, en Windows XP la forma de desactivarlo es siguiendo la siguiente ruta de acciones:

Propiedades de "Mi Equipo", "Opciones avanzadas, Apartado Rendimiento (Botón Configuración) , desmarcar casilla "animar ventanas al maximizar y minimizar". En otro Sistema Operativo tendrás que googlear un poco.

Si no te importa el tiempo de espera entre aplicaciones, puedes aumentar el tiempo de espera en la función:

Sub EsperaIntercambioAplicaciones()
Call WaitMilisec(200)
End Sub[/CODE]

Donde 200 son 0.2 segundos.

Saludos

PD: Ahh si me olvidaba, en la Hoja 3 hay un listado de correspondencia entre numero y tecla asociada de la mayoría de las teclas más usadas, por si quieres agregar algún que otro comando, simplemente sigue el formato de las subrutinas del modulo con tu nombre o el modulo Accesos.

sendkey.xls

publicado

Hola Versulsan:

Está super perfecto, ya le estuve estudiando y creo poder comprenderla y adaptarla a lo que necesito MIL GRACIAS. El único detalle que veo es que el "TAB_press" que corresponde al "SendKey 9" me hace un ENTER y luego un TAB. En realidad lo que necesitaría es solo un TAB sin el ENTER. Tu sábes como poder resolver este detalle ?

Mil gracias por tu gran apoyo.

publicado

En realidad no hace un Enter, forma parte del formato de la celda.

Ahora mismo y a estas horas, lo único que se me ocurre es enviar directamente el texto de la celda al portapapeles saltándose el paso de Control+C. Te he agregado un nuevo modulo llamado "MiClipBoard", ya esta corregida la macro para que envíe solo el texto al portapapeles de modo que no te haga el salto de línea.

IMPORTANTE: Debes agregar la librería FM20.DLL para que te funcione; dichas instrucciones están en la parte superior del modulo "MiClipBoard".

Buenas noches y Saludos.

sendkey_clipboard.xls

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.