Spostamento del cursore del mouse a livello di programmazione

Per iniziare ho trovato questo codice su http://swigartconsulting.blogs.com/tech_blender/2005/08/how_to_move_the.html :

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

Incolla il seguente codice nell’handler di clic del pulsante:

 Win32.POINT p = new Win32.POINT(); px = button1.Left + (button1.Width / 2); py = button1.Top + (button1.Height / 2); Win32.ClientToScreen(this.Handle, ref p); Win32.SetCursorPos(px, py); 

Ciò sposta il puntatore del mouse al centro del pulsante.

Questo codice funziona alla grande, ma non riesco a capire come estenderlo un po ‘. Diciamo che ho Internet Explorer (incorporato in un modulo di Windows) aperto a una pagina web (una pagina a caso non so di prima mano) con una casella di riepilogo a discesa in esso. Ho modificato il codice precedente per spostare il cursore sopra e ottenere la casella di riepilogo a discesa (utilizzando il metodo del clic del mouse mostrato di seguito per eliminare l’elenco verso il basso), e anche spostare su e giù l’elenco evidenziando ogni elemento come il puntatore del mouse va oltre, ma per la vita di me non riesco a capire come effettivamente fare il clic del mouse sull’elemento attualmente selezionato per mantenere la selezione. Il modo in cui sto facendo ora la casella di riepilogo a discesa si chiude e la selezione non viene modificata. Sto usando il seguente codice per il clic del mouse (che ottiene l’elenco a discesa):

 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 (eg 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 } 

Sono sicuro che mi manca qualcosa di semplice qui, ma per la vita di me non riesco a capire di cosa si tratta. Grazie in anticipo a tutti.

peso

È necessario utilizzare SendInput ( http://msdn.microsoft.com/en-us/library/ms646310(VS.85).aspx ) per sintetizzare eventi di clic del mouse invece di utilizzare SendMessages direttamente.

Credo che manchi una WPARAM corretta per il messaggio WM_LBUTTONDOWN , che per il tasto sinistro è MK_LBUTTON

  #define MK_LBUTTON 0x0001