2009-03-15 10 views
21

Pour commencer, je trouve ce code à http://swigartconsulting.blogs.com/tech_blender/2005/08/how_to_move_the.html:En déplaçant le curseur de la souris programme

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; 
    } 
} 

Collez le code suivant dans un clic de eventhandler du bouton:

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); 

Cela déplace le pointeur de la souris au centre du bouton.

Ce code fonctionne très bien, mais je n'arrive pas à comprendre comment l'étendre un peu. Disons que j'ai Internet Explorer (intégré dans un formulaire Windows) ouvert à une page Web (une page aléatoire, je ne sais pas à propos de la main) avec une liste déroulante en elle. J'ai modifié le code ci-dessus pour déplacer le curseur et faire dérouler la liste (en utilisant la méthode de clic de souris ci-dessous pour faire tomber la liste), et aussi monter et descendre la liste en soulignant chaque pointeur de la souris va plus loin, mais pour la vie de moi je n'arrive pas à comprendre comment réellement faire le clic de la souris sur l'élément actuellement sélectionné pour garder la sélection. La façon dont je le fais maintenant la liste déroulante se ferme juste et la sélection n'est pas modifiée. J'utilise le code suivant pour le clic de la souris (qui ne se la liste déroulante):

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 
} 

Je suis sûr que je manque quelque chose de simple, mais pour la vie de moi ne peux pas comprendre ce que c'est. Merci d'avance à tous.

Bob

Répondre

16

Vous devez utiliser SendInput (http://msdn.microsoft.com/en-us/library/ms646310(VS.85).aspx) pour synthétiser les événements de clic de souris au lieu d'utiliser directement SendMessages.

+0

SendInput fixe ce problème et beaucoup d'autres que je rencontrais. Merci de m'avoir aidé à résoudre ce problème. Bob – Beaker

+0

Génial! Merci :) J'étais sur le point de poser la même question. – hasen

+0

@michael Je veux gérer les événements de défilement et de défilement, comment faire? – Faizan

3

Je crois que vous manque un WPARAM correct pour le message WM_LBUTTONDOWN, qui, pour la gauche bouton est MK_LBUTTON

#define MK_LBUTTON   0x0001