2009-03-15 16 views
21

per iniziare ho trovato questo codice in http://swigartconsulting.blogs.com/tech_blender/2005/08/how_to_move_the.html:Spostando il cursore del mouse a livello di codice

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

Incollare il codice riportato di seguito click EventHandler del pulsante:

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

Questo si sposta il puntatore del mouse al centro del pulsante.

Questo codice funziona benissimo, 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 utilizzando il seguente codice per il clic del mouse (che fa ottenere 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 (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 
} 

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

Bob

risposta

16

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

+0

SendInput risolto questo problema e un sacco di altri che ho avuto. Grazie per avermi aiutato a risolvere questo. Bob – Beaker

+0

Fantastico! Grazie :) Stavo per fare la stessa domanda. – hasen

+0

@michael Voglio gestire scorrere e scorrere gli eventi, come faccio? – Faizan

3

credo che ti manca una corretta WPARAM per il messaggio WM_LBUTTONDOWN, che per il pulsante di sinistra è MK_LBUTTON

#define MK_LBUTTON   0x0001 
Problemi correlati