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

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  API SendMessage para Mouse Click C#
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: API SendMessage para Mouse Click C#  (Leído 5,641 veces)
arenoide

Desconectado Desconectado

Mensajes: 167



Ver Perfil
API SendMessage para Mouse Click C#
« en: 27 Junio 2011, 19:44 pm »

Hola,

No sé exactamente si este post va aquí, pero no he encontrado nada parecido.

Veréis, estoy intentando mandarle a una ventana el evento click un una posición X,Y de tal ventana. Lo quiero hacer de forma que me de igual que tenga el foco o no, o esté delante del resto de ventanas u ocutal.

He estado buscando información y he encontrado esto:
http://msdn.microsoft.com/en-us/library/ms644950(v=vs.85).aspx
He seguido buscando y he encontrado algunos ejemplos, pero por más que lo he intentado no consigo mandarle el evento a la otra ventana. Aquí dejo lo que tengo en código

Previamente a esto he recibido el Handle de la ventana correctamente.
Código:
//Declaración de la función API
[DllImport("user32.DLL")]
        static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, uint lParam);

//Evento de click
SendMessage(hWnd, 0x0201, 0,(200 << 16 | 200));
SendMessage(hWnd, 0x0202, 0,(200 << 16 | 200));


He puesto 200,200 hardcodeado como las coordenadas del client pero aun así me sigue sin funcionar. He probado metiendo el wParam y el lParam como IntPtr pero tampoco me hace nada. Tampoco creo que sea problema de las coordenadas que sean de ventana en vez de cliente, porque utilizo un notepad que ocupa toda la pantalla y con 200,200 en algún sitio me debería de clicar.

Alguna idea?


« Última modificación: 27 Junio 2011, 19:56 pm por arenoide » En línea

arenoide

Desconectado Desconectado

Mensajes: 167



Ver Perfil
Re: API SendMessage para Mouse Click C#
« Respuesta #1 en: 28 Junio 2011, 03:00 am »

A Grandes rasgos lo único que quiero conseguir es mandar pulsaciones de ratón a una ventana externa, sin que esta tenga el foco.


En línea

Keyen Night


Desconectado Desconectado

Mensajes: 496


Nothing


Ver Perfil
Re: API SendMessage para Mouse Click C#
« Respuesta #2 en: 28 Junio 2011, 04:23 am »

Una vez hice esta clase en C# 2010 para ello y tambien para enviar pulsaciones de teclas y envio de texto a ventanas externas es justamente lo que necesitas:

Código
  1. using System;
  2. using System.Runtime.InteropServices;
  3. using System.Threading;
  4.  
  5. namespace Sender
  6. {
  7.  
  8.    public sealed class WinApi
  9.    {
  10.  
  11.        [DllImport("Kernel32.dll")]
  12.        public extern static int CloseHandle(IntPtr hObject);
  13.  
  14.        [DllImport("kernel32.dll")]
  15.        public static extern IntPtr OpenProcess(Consts.ProcessAccess dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, int dwProcessId);
  16.  
  17.        [DllImport("kernel32.dll")]
  18.        public static extern bool VirtualProtectEx(IntPtr hProcess, IntPtr lpAddress,
  19.           UIntPtr dwSize, Consts.Protection flNewProtect, out Consts.Protection lpflOldProtect);
  20.  
  21.        [DllImport("user32.dll")]
  22.        public static extern IntPtr SendMessage(IntPtr hWnd, Consts.WindowMessage Msg, int wParam, int lParam);
  23.  
  24.        [DllImport("user32.dll")]
  25.        public static extern bool SetForegroundWindow(IntPtr hWnd);
  26.  
  27.        [DllImport("user32.dll")]
  28.        public static extern bool ShowWindow(IntPtr hWnd, Consts.ShowWindowCommand Cmd);
  29.  
  30.        public class Consts
  31.        {
  32.  
  33.            public enum ProcessAccess : int
  34.            {
  35.                AllAccess = CreateThread | DuplicateHandle | QueryInformation | SetInformation | Terminate | VMOperation | VMRead | VMWrite | Synchronize,
  36.                CreateThread = 0x2,
  37.                DuplicateHandle = 0x40,
  38.                QueryInformation = 0x400,
  39.                SetInformation = 0x200,
  40.                Terminate = 0x1,
  41.                VMOperation = 0x8,
  42.                VMRead = 0x10,
  43.                VMWrite = 0x20,
  44.                Synchronize = 0x100000
  45.            }
  46.  
  47.            public enum ShowWindowCommand : int
  48.            {
  49.                Hide = 0,
  50.                Normal = 1,
  51.                ShowMinimized = 2,
  52.                Maximize = 3,    
  53.                ShowNoActivate = 4,
  54.                Show = 5,
  55.                Minimize = 6,
  56.                ShowMinNoActive = 7,
  57.                ShowNA = 8,
  58.                Restore = 9,
  59.                ShowDefault = 10,
  60.                ForceMinimize = 11
  61.            }
  62.  
  63.            public enum Protection : int
  64.            {
  65.                PAGE_NOACCESS = 0x01,
  66.                PAGE_READONLY = 0x02,
  67.                PAGE_READWRITE = 0x04,
  68.                PAGE_WRITECOPY = 0x08,
  69.                PAGE_EXECUTE = 0x10,
  70.                PAGE_EXECUTE_READ = 0x20,
  71.                PAGE_EXECUTE_READWRITE = 0x40,
  72.                PAGE_EXECUTE_WRITECOPY = 0x80,
  73.                PAGE_GUARD = 0x100,
  74.                PAGE_NOCACHE = 0x200,
  75.                PAGE_WRITECOMBINE = 0x400,
  76.                PAGE_UNKNOW = 0x0
  77.            }
  78.  
  79.            public enum WindowMessage : int
  80.            {
  81.                WM_KEYDOWN = 0x0100,
  82.                WM_KEYUP = 0x0101,
  83.                WM_CHAR = 0x0102,
  84.                WM_LBUTTONDOWN = 0x201,
  85.                WM_LBUTTONUP = 0x202
  86.            }
  87.        }
  88.    }
  89.  
  90.    public sealed class Input
  91.  
  92.    {
  93.  
  94.        public static WinApi.Consts.Protection SetProcessMemoryAccess(IntPtr ProcesshWnd,IntPtr Address, UIntPtr Size, WinApi.Consts.Protection Protection)
  95.        {
  96.            WinApi.Consts.Protection x = WinApi.Consts.Protection.PAGE_UNKNOW;
  97.            IntPtr y = WinApi.OpenProcess(WinApi.Consts.ProcessAccess.VMOperation, false, (int)ProcesshWnd);
  98.  
  99.            WinApi.VirtualProtectEx(y, Address, Size, Protection, out x);
  100.  
  101.            WinApi.CloseHandle(y);
  102.  
  103.            return x;
  104.        }
  105.  
  106.        public static void SendKey(IntPtr WindowhWnd, Int32 key)
  107.        {
  108.            WinApi.SendMessage(WindowhWnd, WinApi.Consts.WindowMessage.WM_KEYDOWN, (int)key, 0);
  109.            WinApi.SendMessage(WindowhWnd, WinApi.Consts.WindowMessage.WM_CHAR, (int)key, 0);
  110.            WinApi.SendMessage(WindowhWnd, WinApi.Consts.WindowMessage.WM_KEYUP, (int)key, 0);
  111.        }
  112.  
  113.        public static void SendClick(IntPtr WindowhWnd, int X, int Y)
  114.        {
  115.            WinApi.SendMessage(WindowhWnd, WinApi.Consts.WindowMessage.WM_LBUTTONUP, 0, 0);
  116.            int lpara = MakeLParam(X, Y);
  117.            WinApi.SendMessage(WindowhWnd, WinApi.Consts.WindowMessage.WM_LBUTTONDOWN, 0, lpara);
  118.            WinApi.SendMessage(WindowhWnd, WinApi.Consts.WindowMessage.WM_LBUTTONUP, 0, lpara);
  119.            Thread.Sleep(25);
  120.        }
  121.  
  122.        public static void SendString(IntPtr WindowhWnd, string String)
  123.        {
  124.            foreach (var x in String)
  125.                SendKey(WindowhWnd, Convert.ToInt32(x));
  126.            Thread.Sleep(3);
  127.        }
  128.  
  129.        public static void SetAsForeground(IntPtr WindowhWnd)
  130.        {
  131.            WinApi.ShowWindow(WindowhWnd, WinApi.Consts.ShowWindowCommand.Maximize);
  132.            WinApi.SetForegroundWindow(WindowhWnd);
  133.        }
  134.  
  135.        private static int MakeLParam(int LoWord, int HiWord) { return ((HiWord << 16) | (LoWord & 0xffff)); }
  136.    }
  137. }
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...
arenoide

Desconectado Desconectado

Mensajes: 167



Ver Perfil
Re: API SendMessage para Mouse Click C#
« Respuesta #3 en: 29 Junio 2011, 12:57 pm »

Hola,

Muchas gracias por el código.

Pongo aquí como lo he solucionado yo por si a alguien le pasa en el futuro. A mí el principal problema era que probando mi código no hacía absolutamente nada en la otra ventana. Por ejemplo, cogia el handle del notepad e intentaba mandarle algo, ya fuera una pulsacion o un click y ni se inmutaba. Tras un día de búsqueda, encontré que la zona de texto del notepad, es un child de la ventana notepad, así que tiene su propio handle, y por eso no me hacía nada.

En el caso de tu código pasaría lo mismo, no? Mandaría la señal al handle de la ventana, pero si la ventana es como el notepad, que dentro tiene otra ventana, pasaría lo mismo, no? Haría falta darle el handle de la zona de escritura para que funcionara creo yo.

Saludos.
En línea

Keyen Night


Desconectado Desconectado

Mensajes: 496


Nothing


Ver Perfil
Re: API SendMessage para Mouse Click C#
« Respuesta #4 en: 29 Junio 2011, 21:51 pm »

Correcto, debes usar el handle del child "edit", usa algún window spy para obtener la información que necesitas.
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...
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines