Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: NOIS en 10 Mayo 2016, 20:20 pm



Título: C# - Simular Click en otra aplicacion
Publicado por: NOIS en 10 Mayo 2016, 20:20 pm
Estoy haciendo un programa simple que pueda simular un click izquierdo, lo cual ya tengo, pero no se como hacer para simularlo en otras aplicaciones.
Este es mi código:
Código
  1. class Program
  2.    {
  3.        // Estructura Para la Posicion del Raton
  4.        public struct Point
  5.        {
  6.            public int X;
  7.            public int Y;
  8.        };
  9.  
  10.        static void Main(string[] args)
  11.        {
  12.            do
  13.            {
  14.                while (Console.ReadKey(true).Key == ConsoleKey.Multiply)
  15.                {
  16.                    LeftMouseClick();
  17.                }
  18.            } while (Console.ReadKey(true).Key != ConsoleKey.Escape);
  19.        }
  20.  
  21.        // Obtener Posicion del Raton
  22.        [DllImport("user32.dll")]
  23.        static extern bool GetCursorPos(ref Point mPoint);
  24.  
  25.        // Evento para Simular Click
  26.        [DllImport("user32.dll")]
  27.        public static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);
  28.  
  29.        public const int LEFTDOWN = 0x02;
  30.        public const int LEFTUP = 0x04;
  31.  
  32.        // Funcion Principal
  33.        public static void LeftMouseClick()
  34.        {
  35.            Point pt = new Point();
  36.            GetCursorPos(ref pt);
  37.            mouse_event(LEFTDOWN, pt.X, pt.Y, 0, 0);
  38.            mouse_event(LEFTUP, pt.X, pt.Y, 0, 0);
  39.  
  40.            Console.WriteLine("Cursor Pos: " + pt.X.ToString() + " - " + pt.Y.ToString());
  41.        }
  42.    }
  43.  


Título: Re: C# - Simular Click en otra aplicacion
Publicado por: Eleкtro en 10 Mayo 2016, 21:10 pm
Debes declarar bastantes más definiciones de la WinAPI para poder identificar la ventana objetivo a la que pretendes enviar la pulsación del mouse, y las dimensiones/rectángulo de dicha ventana para saber en que punto en concreto de la pantalla realizar el "click". Si por lo contrario ya conoces el punto exacto donde realizar el "click", entonces explica que problema encuentras (y si se trata de un videojuego online).

Aquí tienes la referencia online de las funciones implicadas para lo que quieres hacer (Findwindow, FindWindowEx, EnumChildwindows, GetWindowRect, etc):
  • Window Functions | MSDN (https://msdn.microsoft.com/en-us/library/windows/desktop/ff468919%28v=vs.85%29.aspx)

Hay muchísima información, artículos y extensos ejemplos sobre ello que puedes encontrar en los resultados de Google, los códigos ya los encontrarás hechos y en C#, intenta buscar un poco.

Por lo general deberías enumerar los elementos de la UI, pero para evitar y simplificar esa tarea siempre puedes utilizar herramientas como "Microsoft Inspect":
  • https://msdn.microsoft.com/en-us/library/windows/desktop/dd318521%28v=vs.85%29.aspx



De todas formas, estás utilizando una metodología deprecada desde hace muchos años (mouse_event), aunque te servirá igualmente y sin darte ningún problema, pero quizás en el futuro quieras considerar implementar las definiciones de la API "Raw Input":
  • https://msdn.microsoft.com/en-us/library/windows/desktop/ms645543%28v=vs.85%29.aspx
(en mi API gratuita "ElektroKit" puedes encontrar todas las definiciones necesarias y ejemplos de uso, pero en Vb.Net)

Aparte de lo ya mencionado, y dependiendo de cuales sean tus verdaderas intenciones, quizás no deba ser necesario recurrir al código no administrado, por que siempre puedes utilizar el framework de Microsoft UI Automation para inspeccionar los elementos de cualquier interfáz gráfica para obtener toda la información de cualquier ventana de la UI, y realizar acciones como por ejemplo invocar un control ...lo que sería una simulación de "click" sobre un control.
  • https://msdn.microsoft.com/en-us/library/ms747327%28v=vs.110%29.aspx
(también puedes aplicar esta metodología bajo tecnología WindowsForms, solo debes referenciar los ensamblados relacionados con WPF y UI Automation)

Saludos