lunes, 20 de diciembre de 2010

Pegar datos de una aplicación a otra en particular C#

Hace poco me llego un requerimiento bastante especifico, la idea era poder copiar datos de un ClientAccess a un formulario web a efectos de evitar que el usuario tuviese que copiar el texto, cambiar de aplicación, pegar el texto y presionar ENTER para realizar la correspondiente gestión. Para lo anterior y en pos del tiempo decidí diseñar un pequeño midelware que recuperará el texto a copiar, verificará si el foco está sobre la aplicación correcta para finalmente pegar el texto y enviar un ENTER.

Sin ir más lejos, vamos a lo importante.

Lo primero es recuperar el texto y pasarlo al clipboard de Windows

Clipboard.SetText("123456789");

Luego de ésto necesitamos saber si el foco que tenemos está sobre la aplicación que corresponde. Para ésto vamos a utilizar los recursos de la dll user32 junto a dos metodos para acceder por un lado, el ID del proceso y por otro lado el texto de la aplicación con el foco.


[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();

[DllImport("user32.dll")]
static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);


El siguiente paso es recuperar crear un método que nos permita recuperar los texto de la aplicación con el foco:


private string GetActiveWindowTitle()
        {
            const int nChars = 256;
            IntPtr handle = IntPtr.Zero;
            StringBuilder Buff = new StringBuilder(nChars);
            handle = GetForegroundWindow();

            if (GetWindowText(handle, Buff, nChars) > 0)
            {
                return Buff.ToString();
            }
            return null;
        }


Finalmente necesitamos pegar el texto en la aplicación de destino, por lo para esto caso, usaremos nuestra amiga "Calculadora". La forma más rápida para que se pueda probar es hacer un pequeño timer que se ejecute cada 1 seg y que verifique la aplicación activa y realice la operación de pegado.


private void timer1_Tick(object sender, EventArgs e)
        {
            string _buff = GetActiveWindowTitle();
            if (Buff.ToString() == "Calculadora")
            {
                timer1.Enabled = false;  
                SendKeys.Send("^(v)");
            }
            else
            {
                //lo que quieran hacer!
            }
        }

Y listo! Nice and Easy! como decía mi antiguo profesor de la universidad.

No hay comentarios:

Publicar un comentario