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:

  1 using System.Drawing;
  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:

  1 public static void RaiseRightClick(int x, int y)
  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.

  1 using System;
  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!