Ihr sucht eine einfache Möglichkeit, eine bestimmte Aktion in einem Spiel zu automatisieren ? Dann scheut euch diesen Code an!
Funktionsweise
Diese Klasse funktioniert nur auf Windows da hierfür die user32.dll import werden muss, welche auf Linux nicht exisitert. Einfach erklärt benutzt die Klasse die von Windows implementierten Funktionen, welche Interaktionen auf Programme, wie zum Beispiel Mausklicks, zulassen bzw simulieren.
Ihr könnt die aktuellste Version auf Github finden.
Quellcode
Eine funktionierende Version der Klasse:
class Simulator
{
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
public const int MOUSE_LEFT_BUTTON = 0x0001;
public const int MOUSE_LEFT_DOWN = 0x0201;
public const int MOUSE_LEFT_UP = 0x0202;
public const int MOUSE_RIGHT_BUTTON = 0x0002;
public const int MOUSE_RIGHT_DOWN = 0x0204;
public const int MOUSE_RIGHT_UP = 0x0205;
public const int MOUSE_MOVE = 0x0200;
public static bool SendMouseHold(string WindowName, bool useLeft, int x, int y)
{
IntPtr hwnd = GetHWND(WindowName);
int mouse = MOUSE_RIGHT_BUTTON, mouseDown = MOUSE_RIGHT_DOWN;
if (useLeft)
{
mouse = MOUSE_LEFT_BUTTON;
mouseDown = MOUSE_LEFT_DOWN;
}
SendMessage(hwnd, MOUSE_MOVE, 0, MakeCordinate(x, y));
SendMessage(hwnd, mouseDown, mouse, MakeCordinate(x, y));
return false;
}
public static bool SendMouseClick(string WindowName, bool useLeft, int x, int y, int clickCount)
{
IntPtr hwnd = GetHWND(WindowName);
int mouse = MOUSE_RIGHT_BUTTON, mouseDown = MOUSE_RIGHT_DOWN, mouseUp = MOUSE_RIGHT_UP;
if (useLeft)
{
mouse = MOUSE_LEFT_BUTTON;
mouseDown = MOUSE_LEFT_DOWN;
mouseUp = MOUSE_LEFT_UP;
}
for(int i = 0; i < clickCount; i++)
{
SendMessage(hwnd, MOUSE_MOVE, 0, MakeCordinate(x, y));
SendMessage(hwnd, mouseDown, mouse, MakeCordinate(x, y));
SendMessage(hwnd, mouseUp, mouse, MakeCordinate(x, y));
}
return false;
}
public static int MakeCordinate(int LoWord, int HiWord)
{
return (HiWord * 0x10000 | LoWord & 0xFFFF);
}
public static IntPtr GetHWND(string WindowName)
{
IntPtr hWnd = IntPtr.Zero;
foreach (Process pList in Process.GetProcesses())
{
if (pList.MainWindowTitle.Contains(WindowName))
{
hWnd = pList.MainWindowHandle;
}
}
return hWnd;
}
}
Nachdem ihr die Klasse eingebunden habt könnt ihr nun z.b. folgendes aufrufen:
Simulator.SendMouseClick("Test", true, 0, 0, 10);
Damit wird 10 mal ein Linksklick auf dem Fenster Test auf den Koordinaten (0,0) simultiert.
Fals ihr Verbesserungsvorschläge habt, lasst es mich wissen!
Todo
Weitere Tasten einfügen
Neue Funktionen hinzufügen (z.b. gedrückt halten und von Position A nach B wandern)
Linux-Kompatiblität