2012-11-22 30 views
12

Pracuję nad aplikacją formularza Windows w języku C#, Framework 4 (32-bitowe).Przenoszenie myszy na pozycję i kliknięcie lewym przyciskiem myszy

Mam listę, która zawiera symbole myszy i mogę je przechwycić. Jak na razie dobrze.

Ale w pewnym momencie chcę przejść do tych współrzędnych i kliknąć lewym przyciskiem myszy.

Jak to wygląda teraz:

for (int i = 0; i < coordsX.Count; i++) 
{ 
    Cursor.Position = new Point(coordsX[i], coordsY[i]); 
    Application.DoEvents(); 
    Clicking.SendClick(); 
} 

a klasa Kliknięcie:

class Clicking 
    { 
     private const UInt32 MOUSEEVENTF_LEFTDOWN = 0x0002; 
     private const UInt32 MOUSEEVENTF_LEFTUP = 0x0004; 
     private static extern void mouse_event(
       UInt32 dwFlags, // motion and click options 
       UInt32 dx, // horizontal position or change 
       UInt32 dy, // vertical position or change 
       UInt32 dwData, // wheel movement 
       IntPtr dwExtraInfo // application-defined information 
     ); 

     // public static void SendClick(Point location) 
     public static void SendClick() 
     { 
      // Cursor.Position = location; 
      mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, new System.IntPtr()); 
      mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, new System.IntPtr()); 
     } 
    } 

Ale ja dostaję ten błąd:

Could not load type 'program.Clicking' from assembly 'program, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' because the method 'mouse_event' has no implementation (no RVA). 

a ja naprawdę nie rozumiem, na czym polega problem ... Czy wiecie, na czym polega problem? czy znasz lepszy sposób na robienie tego, co próbuję zrobić?

Odpowiedz

8

Czy dołączono następujący wiersz?

[DllImport("user32.dll")] 
static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint dwData, 
    UIntPtr dwExtraInfo); 

To będzie importować funkcję mouse_event z user32 dll, która jest, co chce używać w swoim programie. Obecnie Twój program nie wie o tej metodzie w DLL, dopóki nie określisz, skąd pochodzi.

Strona internetowa PInvoke.net user32 Mouse Event jest bardzo przydatna, jeśli chodzi o podstawy tego typu rzeczy.

Odpowiedź na Directing mouse events [DllImport(“user32.dll”)] click, double click będzie również bardzo pomocna w zrozumieniu.

flags są co nakazuje chcesz wysłać do funkcji mouse_input, w tym przykładzie widać, że jest on wysyłanie zarówno mouse down i mouse up w tej samej linii, to jest w porządku, ponieważ funkcja mouse_event podzieli te flagi i wykonaj je kolejno.


Należy również zauważyć, że metoda ta została zastąpiona przez komendę SendInput, dobry przykład SendInput i SetMousePos można znaleźć At this Blog

+0

Wstawiłem ten wiersz do klasy kliknięcia, ale wciąż ten sam błąd – Mathlight

+0

Czy usunąłeś swoją deklaminację 'mouse_event'? upewnij się, że to robisz i zastąp to tym. – Serdalis

+0

A w jaki sposób ten sposób wysyłania danych będzie pasował do mojego pytania? ponieważ jestem bardzo nowy i nie wiem czy potrzebuję całego kodu z linku ... – Mathlight

1

Chyba brakuje następujący wiersz

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 
+0

że trows błąd: Atrybut „DllImport” nie jest ważne w tego typu deklaracji . Obowiązuje tylko w przypadku deklaracji "metody". – Mathlight