[C] Clic (con SendMessage) en una ventana externa

Iniciado por GonzaFz, 21 Mayo 2012, 08:26 AM

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

GonzaFz

Bueno para que se entienda bien mi objetivo es hacer un programa que haga una serie de clicks en una ventana determinada aunque esta este minimizada.
Busque en google por 3 dias seguidos sin parar y segun entendi con la función SendMessage se puede hacer lo que quiero, es decir, que simule un clic o envie una tecla aunque la ventana este minimizada.
Un simple ejemplo seria enviar una letra al notepad, mi codigo es:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowsFormsApplication5
{
    public partial class Form1 : Form
    {

        [DllImport("user32.dll")]
        public static extern void SendMessage(Int32 hwnd, Int32 Msg, Int32 dx, Int32 dy);

        [DllImport("user32.dll")]
        public static extern int FindWindow(string lpClassName, string lpWindowName);

        [DllImport("user32.dll", SetLastError = true)]
        static extern Int32 FindWindowEx(Int32 hwndParent,
             IntPtr hwndChildAfter,
             string lpszClass,
             string lpszWindow
        );

        const Int32 WM_LBUTTONDOWN = 0x02;
        const Int32 WM_LBUTTONUP = 0x04;
        const Int32 VK_Q = 0x051;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Int32 WindowToFind = FindWindow("notepad", "Sin título: Bloc de notas");
            Int32 cuadro = FindWindowEx(WindowToFind, IntPtr.Zero, "edit", null);
            SendMessage(cuadro, VK_Q, 0, 0);


        }
    }
}


Ese es mi codigo completo, lo que no puedo hacer es que envie la Q al notepad! Intente de varias formas, por ejemplo:

private void button1_Click(object sender, EventArgs e)
        {
            Int32 WindowToFind = FindWindow("notepad", "Sin título: Bloc de notas");
            SendMessage(WindowToFind, VK_Q, 0, 0);
        }


Pero ese hace que cuando se aprieta el boton el programa en este caso notepad se cierre.
Entonces lei en paginas que necesito utilizar la función FindWindowEx (lei algo sobre child, hand y no se que) para seleccionar el cuadro donde se ingresa texto del Bloc de notas, entonces mi codigo queda:

private void button1_Click(object sender, EventArgs e)
        {
            Int32 WindowToFind = FindWindow("notepad", "Sin título: Bloc de notas");
            Int32 cuadro = FindWindowEx(WindowToFind, IntPtr.Zero, "edit", null);
            SendMessage(cuadro, VK_Q, 0, 0);

        }

(los valores como "edit" los obtuve con Spy++)

En este caso al presionar el Button1 el notepad no se cierra pero tampoco se escribe la Q!.
No se que tiene el codigo que no escribe la Q!.

Eso es a modo de prueba pero mi proyecto es crear un BOT para un juego de facebook, ya hice con mouse_event y SetCursorPos pero no es bueno porque no podes usar otros programas mientras el bot este activo.

No se que mas decirles :o! Simplemente si me pueden ayudar les agradeceria porque busque en toda la internet y no puedo solucionar esto..

Utilizo Visual C# 2010 Express

Eternal Idol

Esto no es C, ni C++, es C# asi que lo muevo a donde corresponde.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

seba123neo

La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

GonzaFz

Gracias seba =).
Igualmente despues de muchos millones de intentos logre hacer que funcione correctamente (en c#), el problema ahora es que me di cuenta que no funciona en contenidos FLASH que se encuentren dentro de un WebBrowser.
Pense en poner, por ejemplo, un Label o Panel atras entonces yo en mi funcion de FindWindowEx ponia que lo haga en el Label (que este estaria atras de mi WebBrowser) pero luego de pensar mucho me di cuenta de que no es lo mismo que un macro, si yo hacia eso entonces igual se haria clic en el Label aunque este sea invisible.
Así que bueno me desilucione con no poder hacer clic en Flash :S! Ahora no se me ocurre otra forma de intentarlo..