2009-03-15 12 views
21

Na początek znalazłem ten kod na http://swigartconsulting.blogs.com/tech_blender/2005/08/how_to_move_the.html:Przesuwanie kursora myszy programowo

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

Wklej następujący kod w kliknięcie eventhandler przycisk za:

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

To będzie przesunąć kursor do środka przycisku.

Ten kod działa świetnie, ale nie mogę się dowiedzieć, jak go rozszerzyć. Załóżmy, że mam przeglądarkę internetową (osadzoną w postaci okna) otwartą na stronę internetową (losową stronę, o której nie wiem wcześniej) z rozwijaną listą w niej. Zmodyfikowałem powyższy kod, aby przesunąć kursor i wyświetlić okno listy rozwijane (za pomocą myszy pokazanej poniżej, aby upuścić listę), a także przesuwać w górę iw dół listy podświetlając każdy element jako wskaźnik myszy to koniec, ale nie wiem, jak właściwie kliknąć myszką na aktualnie wybrany element, aby zachować wybór. Sposób, w jaki to robię teraz pole listy rozwijanej po prostu zamyka się i wybór nie jest zmieniony. Używam następujący kod dla kliknięcia myszą (co robi się z listy rozwijanej):

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 
} 

jestem pewien, że jestem brakuje czegoś proste tutaj, ale dla życia mnie nie może dowiedzieć się, co to jest. Z góry dziękuję wszystkim.

Bob

Odpowiedz

16

Należy użyć SendInput (http://msdn.microsoft.com/en-us/library/ms646310(VS.85).aspx) do syntezy zdarzeń kliknięcia myszy zamiast bezpośrednio za pomocą SendMessages.

+0

SendInput stałe ten problem i wiele innych miałem. Dziękuję za pomoc w rozwiązaniu tego problemu. Bob – Beaker

+0

Awesome! Dzięki :) Już miałem zadać to samo pytanie. – hasen

+0

@ Michael Chciałbym obsługiwać przewijanie i przewijanie zdarzeń, jak to zrobić? – Faizan

3

wierzę, że tracisz prawidłowego WPARAM do wiadomości WM_LBUTTONDOWN, który dla lewego przycisku jest MK_LBUTTON

#define MK_LBUTTON   0x0001