Domanda

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 nel gestore di eventi click 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 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 casuale che non conosco prima) con una casella di riepilogo a discesa al suo interno. Ho modificato il codice sopra per spostare il cursore sopra e far cadere la casella di riepilogo (utilizzando il metodo di clic del mouse mostrato di seguito per eliminare l'elenco), e anche spostare su e giù l'elenco evidenziando ogni elemento come puntatore del mouse ripassa, ma per la mia vita non riesco a capire come fare effettivamente il mouse sull'elemento attualmente selezionato per mantenere la selezione. Il modo in cui lo 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 visualizza 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 mia vita non riesco a capire di cosa si tratti. Grazie in anticipo a tutti.

Bob

È stato utile?

Soluzione

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

Altri suggerimenti

Credo che manchi un WPARAM corretto per il messaggio WM_LBUTTONDOWN , che per il tasto sinistro è MK_LBUTTON

 #define MK_LBUTTON          0x0001
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top