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.

  • 109 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      187
    • Comentarios
      97
    • Revisiones
      28

    Más información sobre "Un juego del Rabino en Excel"
    Última descarga
    Por pegones1

    1    1

  • Crear macros Excel

  • Mensajes

    • Perdona @Abraham Valencia pero he estado liado estos días. En realidad todo el problema se reduce a estos dos problemas: Problema 1: El script que "fabrica" SAP y que luego "pego" en la macro, no es capaz de  guardar archivos en SharePoint. He estado buscando, y en realidad muchas personas tienen ese problema (no poder guardar un Excel en SAP a través de VBA). Eso muy probablemente sean problemas de permisos, que no puedo cambiar (no soy administrador de nada). Como no puedo solucionarlo así, paso al plan B, que es guardar en Excel que me genera SAP en el ordenador de cada usuario que ejecute la plantilla (y que sí está guardada en SharePoint), para después con PowerQuery llamar a ese Excel (el export). Para ello, pretendo guardar el export, en la ruta relativa "C:\..\..\..\OneDrive - NombreEmpresa\Documentos\SAP\SAP GUI" donde los \..\..\..\ saltan las rutas personales de cada usuario (tipo C:\users\IDusuario\). Eso lo hace bien, y el archivo se guarda en la ruta de cada usuario que lo usa, pero surge el problema 2 Problema 2: PowerQuery no trabaja con rutas relativas del tipo  "C:\..\..\..\OneDrive - NombreEmpresa\Documentos\SAP\SAP GUI" necesita que sea del tipo fija "C:\users\IDusuario\OneDrive - NombreEmpresa\Documentos\SAP\SAP GUI" pero claro, IDusuario es diferente para cada usuario.   Pero escribiendo todo esto, creo que he dado con una posible solución, no grabar el export en una ruta de usuario, sino en una en la raiz de C:, que siempre será igual para todos los usuarios, del tipo C:\Sap\export.xlsx que seria igual en todos los ordenadores. Asi sí podría decirle a PowerQuery que vaya siempre a la ruta C:\Sap\ que existirá en todos los ordenadores. Mañana intentaré hacer pruebas, aunque mi solución ideal seria que se pudiera guardar en el SharePoint. Saludos.
    • Hola La opción brindada por @torquemada es correcta, funciona, pero hay algunos inconvenientes que (desde mi punto de vista) no la convierten en mi primera elección. Los inconvenientes son: Tendrías que ir columna por columna haciendo los reemplazos, claro que no se harían a mano sino que utilizarías la opción reemplazar o la opción texto en columnas, aun asi demorará un poquito y será trabajoso. Cada vez que descargues otro listado, tendrás que volver a realizar los reemplazos. Me parece una mejor propuesta lo siguiente: Descarga los movimientos a un archivo de Excel Desde tu control de pagos (otro archivo) cargas los movimientos del archivo descargado mediante Power Query Power Query hará los reemplazos y reconocerá todo correctamente (sin que tengas que hacer nada especial) Cuando descargues los movimientos un día posterior, solamente tendrás que hacer clic en "Actualizar" y todo funcionará en automático
    • Hola a todos, Efectivamente, me temo que tal como trabajan las funciones =HOY() y/o =AHORA() (volátiles), sólo con macros puedes obtener soluciones. Un recurso pedestre podría ser, cada vez que quieras que se fije un dato, te sitúes en esa celda y pulses F2, F9 e INTRO.  Pero claro, puede ser un inconveniente si hay que hacerlo repetitivamente en muchas ocasiones,.............. en fin, lo comento sólo como posibilidad. Saludos,
    • Hola nuevamente, mi duda sigue siendo la ruta, o rutas, finales que quedan, esas que llamas "relativas"; igual por si acaso pon 3 o 4 de esas, tal cual son y/o se ven en el explorador de cada PC y, de ser posible, en cualquier otro "lado" en que las veas.
    • Hola, tal cual se plantea, solamente con macros (VBA); en todo caso, hacerlo a mano o con "CTRL + ;". Saludos.
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • 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.