Myszka – z pozoru urządzenie, które bez ludzkiej ręki nie jest w stanie nic zrobić. Błąd! Istnieje możliwość nadania jej “życia” poprzez wywoływanie odpowiednich zdarzeń z kodu aplikacji. Aby to osiągnąć przydatne może być wykorzystanie poniższego helpera, a właściwie szablonu helpera, który można w łatwy sposób rozszerzyć o kolejne metody:
2 using System.Runtime.InteropServices;
3 using System.Windows.Forms;
4
5 namespace ConsAppClicker
6 {
7 public static class MouseHelper
8 {
9 #region Internal
10 [DllImport(“user32.dll”, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
11 private static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);
12
13 private const int MOUSEEVENTF_LEFTDOWN = 0x02;
14 private const int MOUSEEVENTF_LEFTUP = 0x04;
15 private const int MOUSEEVENTF_RIGHTDOWN = 0x08;
16 private const int MOUSEEVENTF_RIGHTUP = 0x10;
17 #endregion
18
19 #region LMB
20 public static void RaiseDoubleClick()
21 {
22 int x = Cursor.Position.X;
23 int y = Cursor.Position.Y;
24 RaiseLeftClick(x, y);
25 RaiseLeftClick(x, y);
26 }
27
28 public static void RaiseLeftClick()
29 {
30 int x = Cursor.Position.X;
31 int y = Cursor.Position.Y;
32 RaiseLeftClick(x, y);
33 }
34
35 private static void RaiseLeftClick(int x, int y)
36 {
37 mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, x, y, 0, 0);
38 }
39 #endregion
40
41 #region RMB
42 public static void RaiseRightClick()
43 {
44 int x = Cursor.Position.X;
45 int y = Cursor.Position.Y;
46 RaiseRightClick(x, y);
47 }
48
49 public static void RaiseRightClick(int x, int y)
50 {
51 mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, x, y, 0, 0);
52 }
53 #endregion
54
55 #region Position
56 public static void SetPosition(int x, int y)
57 {
58 Cursor.Position = new Point(x, y);
59 }
60 #endregion
61 }
62 }
63
Oferuje on możliwość ustawienia odpowiedniej pozycji kursora myszy oraz wywołania najważniejszych jej zdarzeń dla aktualnej pozycji. Jak widać przy pomocy PInvoke możemy wykorzystać wywołanie zdarzenia znajdujące się w bibliotece user32.dll, która przyjmuje flagę zdarzenia (bitowa flaga, lub ich suma) oraz współrzędne zdarzenia. Eksperymentując z tym helperem w
pewnym momencie zapewne zauważycie, że zdarzenie jest uruchamiane dla aktualnej pozycji kursora niezależnie od tego co jest podane w linii 51 (wywołanie mouse_event)… Dziwne zachowanie, być może zależy od czynników, do których jeszcze nie dotarłem podczas drążenia tematu. W związku z tym można by korzystać tylko z metody SetPosition oraz ze zmienionej postaci Raise*Click, na przykład:
2 {
3 mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);
4 }
Oto przykład wykorzystania, który przy domyślnych ustawieniach pulpitu i ikon (“Mój” komputer” w lewym gornym rogu) po dwóch sekundach od uruchomienia otworzy okno eksploratora plików.
2
3 namespace ConsAppClicker
4 {
5 class Program
6 {
7 static void Main(string[] args)
8 {
9 Console.WriteLine(“Console mouse click demo”);
10 System.Threading.Thread.Sleep(2000);
11 MouseHelper.SetPosition(20, 20);
12 MouseHelper.RaiseDoubleClick();
13 Console.WriteLine(“Done!”);
14 Console.ReadLine();
15 }
16 }
17 }
Teraz ożywienie poczciwego “szczura” jest już w zasięgu ręki. Miłej zabawy!