Spostamento del cursore del mouse a livello di codice
-
22-07-2019 - |
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
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