elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  [VB.NET] Pegar texto en otra ventana
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [VB.NET] Pegar texto en otra ventana  (Leído 5,002 veces)
EAX_

Desconectado Desconectado

Mensajes: 26


inside myself..


Ver Perfil
[VB.NET] Pegar texto en otra ventana
« en: 4 Octubre 2012, 00:55 am »

Hola comunidad,
    He estado investigando sobre este tema en particular hace unos días y no he encontrado lo que necesito. Lo que quiero hacer es que mi programa envíe la instrucción de pegar (CTRL + V) en otra ventana al momento de que yo utilice un atajo de teclado.

Estuve buscando eventos que podrían ayudarme y al final me encontré con una función que me permitió bindear una tecla y pude enviar por teclado lo que quería pegar.

Código
  1.    Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, ByVal keyData As System.Windows.Forms.Keys) As Boolean
  2.        If msg.WParam.ToInt32 = CInt(Keys.F1) Then
  3.            MsgBox("Tecla F1 pulsada")
  4.        End If
  5.      Return MyBase.ProcessCmdKey(msg, keyData)
  6.    End Function
  7.  

Enviaba la cadena que quiero pegar con Sendkeys.Send() pero el problema es que si no tengo activa la ventana de mi aplicación la tecla no es procesada por el programa.

Confío que alguien me podrá dar una ayudadita

Gracias de antemano y saludos


En línea

"Everyone is a genius. But if you judge a fish on its ability to climb a tree, it will live its whole life believing it is stupid." - Albert Einstein
Keyen Night


Desconectado Desconectado

Mensajes: 496


Nothing


Ver Perfil
Re: [VB.NET] Pegar texto en otra ventana
« Respuesta #1 en: 4 Octubre 2012, 04:38 am »

El API SendMenssage, puede enviar pulsaciones de teclas a un handle correspondiente a una ventana especifica, usando los parámetros WM_KEYUP, WM_KEYCHAR y WM_KEYDOWN. Una vez realice una clase para ese propósito está en C# pero es fácilmente traducible a Vb.Net.

Código
  1.    public sealed class Input
  2.  
  3.    {
  4.  
  5.      public enum WindowMessage : int
  6.            {
  7.                WM_KEYDOWN = 0x0100,
  8.                WM_KEYUP = 0x0101,
  9.                WM_CHAR = 0x0102,
  10.                WM_LBUTTONDOWN = 0x201,
  11.                WM_LBUTTONUP = 0x202
  12.            }
  13.  
  14.        public static void SendKey(IntPtr WindowhWnd, Int32 key)
  15.        {
  16.            SendMessage(WindowhWnd, WindowMessage.WM_KEYDOWN, (int)key, 0);
  17.            SendMessage(WindowhWnd, WindowMessage.WM_CHAR, (int)key, 0);
  18.            SendMessage(WindowhWnd, WindowMessage.WM_KEYUP, (int)key, 0);
  19.        }
  20.  
  21.        public static void SendClick(IntPtr WindowhWnd, int X, int Y)
  22.        {
  23.            SendMessage(WindowhWnd, WindowMessage.WM_LBUTTONUP, 0, 0);
  24.            int lpara = MakeLParam(X, Y);
  25.            SendMessage(WindowhWnd, WindowMessage.WM_LBUTTONDOWN, 0, lpara);
  26.            SendMessage(WindowhWnd, .WindowMessage.WM_LBUTTONUP, 0, lpara);
  27.            Thread.Sleep(25);
  28.        }
  29.  
  30.        public static void SendString(IntPtr WindowhWnd, string String)
  31.        {
  32.            foreach (var x in String)
  33.                SendKey(WindowhWnd, Convert.ToInt32(x));
  34.            Thread.Sleep(3);
  35.        }
  36.  
  37.        private static int MakeLParam(int LoWord, int HiWord) { return ((HiWord << 16) | (LoWord & 0xffff)); }
  38.    }


« Última modificación: 5 Octubre 2012, 01:39 am por Keyen Night » En línea

La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...
EAX_

Desconectado Desconectado

Mensajes: 26


inside myself..


Ver Perfil
Re: [VB.NET] Pegar texto en otra ventana
« Respuesta #2 en: 5 Octubre 2012, 00:57 am »

Hola, gracias por responder. Tengo una duda. Con esa clase que me das se supone que envías mensajes a una ventana en especifico cierto?

Sabes si hay una forma de que (mientras la ventana no esté activa) siga monitoreando mis teclas y pueda activar un evento?

Me gustaría aprovechar el evento OnKeyPress del formulario para lograr enviar algun texto a nivel PC asi como un CTRL + V mientras mi formulario no está activo.

Con respecto a la clase, estuve tratando de entenderla y no lo logré.

Saludos
« Última modificación: 5 Octubre 2012, 00:59 am por EAX_ » En línea

"Everyone is a genius. But if you judge a fish on its ability to climb a tree, it will live its whole life believing it is stupid." - Albert Einstein
Keyen Night


Desconectado Desconectado

Mensajes: 496


Nothing


Ver Perfil
Re: [VB.NET] Pegar texto en otra ventana
« Respuesta #3 en: 5 Octubre 2012, 01:49 am »

Windows comunica muchas cosas a las aplicaciones a través de mensajes, y estos se envían por medio del API SendMessage, esta API es extremadamente dinámica, quiero decir que posee múltiples funcionalidades, para definir que tipo de tarea queremos que SendMessage efectué, existe una lista gigantesca de constantes WM_XXX, que describen situaciones, para este caso tenemos WM_KEYDOWN, WM_KEYUP, WM_CHAR, enviar tecla que se presiona, enviar tecla que se suelta y el Char que se imprime, respectivamente. Una vez definida la constate WM a pasar a SendMessage, entonces enviamos los parámetros para el trabajo que esta a punto de efectuar la función, en el caso de enviar una tecla construí la función SendKey:
Código
  1.        public static void SendKey(IntPtr WindowhWnd, Int32 key)
  2.        {
  3.            SendMessage(WindowhWnd, WindowMessage.WM_KEYDOWN, (int)key, 0);
  4.            SendMessage(WindowhWnd, WindowMessage.WM_CHAR, (int)key, 0);
  5.            SendMessage(WindowhWnd, WindowMessage.WM_KEYUP, (int)key, 0);
  6.        }

El primer parámetro es el Handle (hWnd) de la ventana al cuál se va a enviar el mensaje, el siguiente parámetro es la constante WM, el tercer parámetro es el valor ASCII de la tecla a enviar, el último se omite para este trabajo.

SendMenssage, imita en la ventana lo que el usuario hace para presionar una tecla, primero la pulsa (WM_KEYDOWN) luego se imprime (WM_CHAR) y la suelta (WM_KEYUP).

Para capturar las teclas que se presionan fuera de tu aplicación tienes las dos opciones más usadas: el API GetAsynKeyState y el Hook de Teclado, que es mucho más limpio y organizado el trabajo. Acerca de esto hay mucha documentación tanto en el foro como en internet en general ;)
« Última modificación: 5 Octubre 2012, 01:51 am por Keyen Night » En línea

La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...
EAX_

Desconectado Desconectado

Mensajes: 26


inside myself..


Ver Perfil
Re: [VB.NET] Pegar texto en otra ventana
« Respuesta #4 en: 5 Octubre 2012, 03:04 am »

Agradezco tu respuesta, gracias a eso pude llegar a algo más acercado a mi realidad. Encontré algo interesante que es la función RegisterHotKey, con eso logré definir un atajo de teclado que fuera de la aplicación aun es posible ejecutarlo y, con eso, puedo hacer alguna acción (como enviar el texto que necesito) Ahora el único problema es que me gustaría que el HotKey fuese una sola tecla.

Si alguien sabe por favor responder.

Saludos

Código
  1. Imports System.Runtime.InteropServices
  2.  
  3. Public Class Form1
  4.    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
  5.        If m.Msg = WM_HOTKEY Then
  6.            Dim id As IntPtr = m.WParam
  7.            Select Case (id.ToString)
  8.                Case "100"
  9.                    SendKeys.Send("KEYS TO SEND")
  10.            End Select
  11.        End If
  12.        MyBase.WndProc(m)
  13.    End Sub
  14.  
  15.  
  16.    Public Const WM_HOTKEY As Integer = &H312
  17.  
  18.  
  19.    <DllImport("User32.dll")> _
  20.  Public Shared Function RegisterHotKey(ByVal hwnd As IntPtr, _
  21.                      ByVal id As Integer, ByVal fsModifiers As Integer, _
  22.                      ByVal vk As Integer) As Integer
  23.    End Function
  24.  
  25.    <DllImport("User32.dll")> _
  26.    Public Shared Function UnregisterHotKey(ByVal hwnd As IntPtr, _
  27.                        ByVal id As Integer) As Integer
  28.    End Function
  29.  
  30.    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
  31.        UnregisterHotKey(Me.Handle, 100)
  32.    End Sub
  33.  
  34.    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  35.        RegisterHotKey(Me.Handle, 100, MOD_ALT, Keys.G)
  36.    End Sub
  37. End Class
  38.  
En línea

"Everyone is a genius. But if you judge a fish on its ability to climb a tree, it will live its whole life believing it is stupid." - Albert Einstein
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
buscvo programa k pueda cortr un trozo de cancion y pegar otra cancion encima
Multimedia
manu88 1 3,797 Último mensaje 31 Enero 2006, 21:31 pm
por Sourraund
AlphaBlend traer desde otra ventana
Programación Visual Basic
LeandroA 1 1,381 Último mensaje 11 Mayo 2006, 21:28 pm
por Ironhorse
Mostrar los datos de un treeview en otra ventana...
Scripting
El mas antiguo 0 4,643 Último mensaje 12 Marzo 2022, 00:13 am
por El mas antiguo
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines