visual texto sobre por pasar mostrar informacion imagen eventos evento emergente dar boton c# windows click mouse message

c# - texto - pasar el mouse por la imagen y dar informacion



programáticamente haga clic con el ratón en otra ventana (2)

Encontré en el pasado, una forma de enviar un mensaje a Windows Media Player, ¡ así que lo usé para simular el clic en la aplicación que quería!

¡Usando esta clase (código abajo) para encontrar la ventana y enviar los mensajes que desea!

using System; using System.Runtime.InteropServices; namespace Mouse_Click_Simulator { /// <summary> /// Summary description for Win32. /// </summary> public class Win32 { // The WM_COMMAND message is sent when the user selects a command item from // a menu, when a control sends a notification message to its parent window, // or when an accelerator keystroke is translated. public const int WM_KEYDOWN = 0x100; public const int WM_KEYUP = 0x101; public const int WM_COMMAND = 0x111; public const int WM_LBUTTONDOWN = 0x201; public const int WM_LBUTTONUP = 0x202; public const int WM_LBUTTONDBLCLK = 0x203; public const int WM_RBUTTONDOWN = 0x204; public const int WM_RBUTTONUP = 0x205; public const int WM_RBUTTONDBLCLK = 0x206; // The FindWindow function retrieves a handle to the top-level window whose // class name and window name match the specified strings. // This function does not search child windows. // This function does not perform a case-sensitive search. [DllImport("User32.dll")] public static extern int FindWindow(string strClassName, string strWindowName); // The FindWindowEx function retrieves a handle to a window whose class name // and window name match the specified strings. // The function searches child windows, beginning with the one following the // specified child window. // This function does not perform a case-sensitive search. [DllImport("User32.dll")] public static extern int FindWindowEx( int hwndParent, int hwndChildAfter, string strClassName, string strWindowName); // The SendMessage function sends the specified message to a window or windows. // It calls the window procedure for the specified window and does not return // until the window procedure has processed the message. [DllImport("User32.dll")] public static extern Int32 SendMessage( int hWnd, // handle to destination window int Msg, // message int wParam, // first message parameter [MarshalAs(UnmanagedType.LPStr)] string lParam); // second message parameter [DllImport("User32.dll")] public static extern Int32 SendMessage( int hWnd, // handle to destination window int Msg, // message int wParam, // first message parameter int lParam); // second message parameter } }

Por ejemplo:

Win32.SendMessage(iHandle, Win32.WM_LBUTTONDOWN, 0x00000001, 0x1E5025B);

¡Aquí está el código fuente de mi aplicación que creé para hacer clic automáticamente en la aplicación "BlueStacks" en un intervalo específico!

Para FindWindow , wParam , lParam , etc., puede preguntarme cómo hacerlo. no es muy dificil :);) Espero que haya ayudado! :)

¿Es posible hacer clic programáticamente en una ubicación en otra ventana sin mover el mouse a esa ubicación e incluso si la ventana no está en la parte superior? Quiero enviar un tipo de mensaje a otra ventana para simular un clic del ratón en una ubicación.

Intenté lograr esto con PostMessage:

PostMessage(WindowHandle, 0x201, IntPtr.Zero, CreateLParam(300,300)); PostMessage(WindowHandle, 0x202, IntPtr.Zero, CreateLParam(300,300));

Hice la función CreateLParam de esta manera:

private static IntPtr CreateLParam(int LoWord, int HiWord) { return (IntPtr)((HiWord << 16) | (LoWord & 0xffff)); }

El problema es que la ventana se bloquea en su ubicación. Creo que mi aplicación hace clic en la coordenada (1,1). ¿Puede alguien ayudarme con este problema?

Editar: Esto es PostMessage:

[return: MarshalAs(UnmanagedType.Bool)] [DllImport("user32.dll")] public static extern bool PostMessage(IntPtr WindowHandle, int Msg, IntPtr wParam, IntPtr lParam);

Y 0x201 y 0x202 son WM_LBUTTONDOWN y WM_LBUTTONUP respectivamente.


No puede hacerlo enviando mensajes, en su lugar use SendInput Windows API.

Llame al método ClickOnPoint, este es un ejemplo del evento de clic de formulario, por lo que this.handle es el identificador de formulario, tenga en cuenta que estas son las coordenadas del cliente en la ventana que se envía el identificador de brujas, puede cambiar esto fácilmente y enviar las coordenadas de la pantalla, y en ese caso no lo hace. No es necesario manejar o llamar a ClientToScreen a continuación.

ClickOnPoint(this.Handle, new Point(375, 340));

ACTUALIZACIÓN: usando SendInput ahora, tnx Tom.

por cierto Usé solo las declaraciones necesarias para este ejemplo, para más, hay una buena biblioteca: Windows Input Simulator (C # SendInput Wrapper - Simular teclado y mouse)

public class ClickOnPointTool { [DllImport("user32.dll")] static extern bool ClientToScreen(IntPtr hWnd, ref Point lpPoint); [DllImport("user32.dll")] internal static extern uint SendInput(uint nInputs, [MarshalAs(UnmanagedType.LPArray), In] INPUT[] pInputs, int cbSize); #pragma warning disable 649 internal struct INPUT { public UInt32 Type; public MOUSEKEYBDHARDWAREINPUT Data; } [StructLayout(LayoutKind.Explicit)] internal struct MOUSEKEYBDHARDWAREINPUT { [FieldOffset(0)] public MOUSEINPUT Mouse; } internal struct MOUSEINPUT { public Int32 X; public Int32 Y; public UInt32 MouseData; public UInt32 Flags; public UInt32 Time; public IntPtr ExtraInfo; } #pragma warning restore 649 public static void ClickOnPoint(IntPtr wndHandle , Point clientPoint) { var oldPos = Cursor.Position; /// get screen coordinates ClientToScreen(wndHandle, ref clientPoint); /// set cursor on coords, and press mouse Cursor.Position = new Point(clientPoint.X, clientPoint.Y); var inputMouseDown = new INPUT(); inputMouseDown.Type = 0; /// input type mouse inputMouseDown.Data.Mouse.Flags = 0x0002; /// left button down var inputMouseUp = new INPUT(); inputMouseUp.Type = 0; /// input type mouse inputMouseUp.Data.Mouse.Flags = 0x0004; /// left button up var inputs = new INPUT[] { inputMouseDown, inputMouseUp }; SendInput((uint)inputs.Length, inputs, Marshal.SizeOf(typeof(INPUT))); /// return mouse Cursor.Position = oldPos; } }