2009-03-15 24 views
21

Para empezar me encontré con este código en http://swigartconsulting.blogs.com/tech_blender/2005/08/how_to_move_the.html:Mover el cursor del ratón mediante programación

public class Win32 
{ 
    [DllImport("User32.Dll")] 
    public static extern long SetCursorPos(int x, int y); 

    [DllImport("User32.Dll")] 
    public static extern bool ClientToScreen(IntPtr hWnd, ref POINT point); 

    [StructLayout(LayoutKind.Sequential)] 
    public struct POINT 
    { 
     public int x; 
     public int y; 
    } 
} 

Pegue el código siguiente en el botón de clic eventhandler:

Win32.POINT p = new Win32.POINT(); 
p.x = button1.Left + (button1.Width/2); 
p.y = button1.Top + (button1.Height/2); 

Win32.ClientToScreen(this.Handle, ref p); 
Win32.SetCursorPos(p.x, p.y); 

Esto moverá el puntero del ratón al centro del botón.

Este código funciona muy bien, pero parece que no puedo entender cómo extenderlo un poco. Digamos que tengo un explorador de Internet (incrustado en un formulario de Windows) abierto a una página web (alguna página al azar que no conozco de antemano) con un cuadro de lista desplegable. Modifiqué el código anterior para mover el cursor y hacer que aparezca el cuadro de lista desplegable (usando el método de clic del ratón que se muestra a continuación para soltar la lista), y también mover hacia arriba y hacia abajo la lista resaltando cada elemento como el puntero del mouse pasa de largo, pero por mi vida no puedo imaginar cómo hacer que el mouse haga clic en el elemento actualmente seleccionado para mantener la selección. La forma en que lo estoy haciendo ahora, el cuadro de lista desplegable simplemente se cierra y la selección no cambia. Estoy usando el siguiente código para el clic del ratón (que se pone a la lista desplegable):

private static void MouseClick(int x, int y, IntPtr handle) //handle for the browser window 
{ 
    IntPtr lParam = (IntPtr)((y << 16) | x); // The coordinates 
    IntPtr wParam = IntPtr.Zero; // Additional parameters for the click (e.g. Ctrl) 

    const uint downCode = 0x201; // Left click down code 
    const uint upCode = 0x202; // Left click up code 

    SendMessage(handle, downCode, wParam, lParam); // Mouse button down 
    SendMessage(handle, upCode, wParam, lParam); // Mouse button up 
} 

Estoy seguro de que me falta algo sencillo aquí, pero para la vida de mí no puedo entender lo que es. Gracias de antemano a todos.

Bob

Respuesta

16

Debe utilizar SendInput (http://msdn.microsoft.com/en-us/library/ms646310(VS.85).aspx) para sintetizar eventos de clic de ratón en lugar de utilizar directamente SendMessages.

+0

SendInput fijado este problema y muchos otros que estaba teniendo. Gracias por ayudarme a resolver esto. Bob – Beaker

+0

¡Impresionante! Gracias :) Estaba a punto de hacer la misma pregunta. – hasen

+0

@michael Deseo gestionar los eventos de desplazamiento y desplazamiento, ¿cómo puedo hacer eso? – Faizan

3

creo que se está perdiendo una correcta WPARAM para el mensaje WM_LBUTTONDOWN, que para el botón izquierdo es MK_LBUTTON

#define MK_LBUTTON   0x0001 
Cuestiones relacionadas