Mausbedienung mit Windows-API in Python

Auslösen

Als ich Ende letzten Jahres auf Twitter ein Video sah, in dem das Anti-Rückstoß-Makro eines bestimmten FPS-Spiels vorgestellt wurde, dachte ich, dass es schwierig sein würde, das Makro stetig anzupassen ~~ Es war fast ein betrügerisches Tool, aber gleichzeitig wurde es im Voraus festgelegt. Ich fragte mich, ob ich etwas Interessantes tun könnte, wenn ich die Bewegungen im Spiel ausführen könnte.

Versuch und Irrtum

In Python gibt es Bibliotheken wie PyAutoGUI und pynput, die Maus und Tastatur bedienen. Mit diesen können Sie sie einfach bedienen und automatisieren. Das Spiel, das ich spielte, akzeptierte jedoch keine Operation. Ist DirectX beteiligt? Nach verschiedenen Suchen fand ich einen Ersatz namens Serpent.AI, mit dem KI Spiele spielen kann. Serpent.AI scheint das Spiel mit der Win32-API zu betreiben, und das Spiel, das ich spiele, könnte mit der Win32-API betrieben werden.

Umgebung

Code schreiben

Es gibt zwei Möglichkeiten, die Maus mit der Win32-API zu bedienen.

  1. Verwenden Sie SetCursorPos
  2. Verwenden Sie SendInput

1. Verwenden Sie SetCursorPos

Verwenden Sie die Standardbibliothek ctypes, um die Win32-API von Python aus aufzurufen.

input_1.py


import ctypes

#SetCursorPos(x, y)
ctypes.windll.user32.SetCursorPos(200, 300)

Geben Sie einfach mit x, y (horizontal, vertikal) an. Der Wert von (0,0) erhöht sich unten rechts oben links auf dem Bildschirm. Dieser Code bewegt den Cursor auf x: 200 y: 300. SetCursorPos kann das Spiel jedoch nicht bedienen.

2. Verwenden Sie SendInput

Sie können den Mauszeiger bewegen, klicken und eingeben. Weitere Informationen zur Verwendung finden Sie unter hier. Der Code lautet this und [this] -union-in-python-to-send-keyboard-events-in-windows) wurde als Referenz verwendet.

Deklarieren Sie die für SendInput erforderliche INPUT-Struktur und die MOUSEINPUT-Struktur, die Informationen zu Mausoperationen enthält.

input_2.py


import ctypes

ULONG_PTR = ctypes.POINTER(ctypes.c_ulong)

#Mausereignisinformationen
class MOUSEINPUT(ctypes.Structure):
    _fields_ = [("dx", ctypes.c_long),
                ("dy", ctypes.c_long),
                ("mouseData", ctypes.c_ulong),
                ("dwFlags", ctypes.c_ulong),
                ("time", ctypes.c_ulong),
                ("dwExtraInfo", ULONG_PTR)]


class INPUT(ctypes.Structure):
    _fields_ = [("type", ctypes.c_ulong),
                ("mi", MOUSEINPUT)]

Gibt das SendInput-Argument und den Rückgabetyp an.

input_2.py


LPINPUT = ctypes.POINTER(INPUT)

SendInput = ctypes.windll.user32.SendInput
SendInput.argtypes = (ctypes.c_uint, LPINPUT, ctypes.c_int)
SendInput.restype = ctypes.c_uint

Wenn Sie die Koordinaten konvertieren und in SendInput eintauchen, bewegt sich der Mauszeiger.

input_2.py


x, y = 200, 300
x = x * 65536 // 1920
y = y * 65536 // 1080
_mi = MOUSEINPUT(x, y, 0, (0x0001 | 0x8000), 0, None)
SendInput(1, INPUT(0, _mi), ctypes.sizeof(INPUT))

Die ausführliche Erklärung wird lang sein, In diesen beiden Zeilen werden die Koordinaten des Cursors (200.300) in die Koordinaten 0 bis 65.535 (6826.18204) konvertiert. Der Divisor ändert sich abhängig von der Bildschirmauflösung. Die Unterteilung ist abgerundet, aber es ist mir egal, weil sie sich nicht wesentlich von der Rundung unterscheidet. Wie später beschrieben wird, ist es nur für die Bewegung in absoluten Koordinaten erforderlich.

input_2.py


x = x * 65536 // 1920 # x * 65536 //Bildschirmauflösung(Seite)
y = y * 65536 // 1080 # y * 65536 //Bildschirmauflösung(Vertikal)

Die Drehung des Rades beträgt 120, was einer Kerbe einer Standardmaus entspricht. Es gibt kein Problem mit anderen Ganzzahlen als Vielfachen von 120. Sie können auch horizontal scrollen. Mit dem Bitoperator | können mehrere Mausereignisse gesetzt werden. Ich habe die häufig verwendeten Elemente in der Tabelle zusammengefasst. Klicken Sie hier für Details (https://docs.microsoft.com/ja-jp/windows/win32/api/winuser/ns-winuser-mouseinput)

Wert Bedeutung
0x8000 Verwenden Sie absolute Koordinaten, relative Koordinaten, falls nicht angegeben
0x0001 Gibt an, ob der Cursor bewegt werden soll
0x0002 Drücken Sie die linke Taste
0x0004 Lassen Sie die linke Taste los
0x0008 Drücken Sie die rechte Taste
0x0010 Lassen Sie die rechte Taste los
0x01000 Gibt an, ob horizontal gescrollt werden soll
0x0800 Gibt an, ob vertikal gescrollt werden soll

Eine Sache, die hier zu beachten ist. Das Format der Koordinaten ändert sich je nachdem, ob Sie absolute oder relative Koordinaten verwenden. Bei Verwendung von absoluten Koordinaten muss in Koordinaten von 0 bis 65.535 konvertiert werden. Bei Verwendung von relativen Koordinaten ist jedoch keine Konvertierung von Koordinaten erforderlich. In diesem Fall bleibt es (200.300).

input_2.py


# MOUSEINPUT(x-Koordinate,y-Koordinate,Raddrehzahl,Mausereignis, 0, None)
_mi = MOUSEINPUT(x, y, 0, (0x0001 | 0x8000), 0, None)

Es gibt drei Arten von Eingaben, wie in der folgenden Tabelle gezeigt.

Wert Bedeutung
0 Mauseingabe
1 Tastatureingabe
2 Hardware-Eingang

input_2.py


# SendInput(1, INPUT(Art der Eingabe, _mi), ctypes.sizeof(INPUT))
SendInput(1, INPUT(0, _mi), ctypes.sizeof(INPUT))

Zusammenfassung

In SendInput können Sie die Tastatur zusätzlich zur Mausbedienung bedienen. Der Einfachheit halber haben wir uns jedoch auf die Mausbedienung konzentriert. Das nächste Mal werde ich es einschließlich der Tastaturbedienung erklären.

Schließlich

Ich denke nicht, dass es für jemanden relevant ist, der diesen Artikel liest, aber das Programm selbst wurde vor langer Zeit abgeschlossen. Als ich das Programm schrieb, tat ich es, ohne tief über Yoshi nachzudenken, wenn ich umzog. Als ich später darauf zurückblickte, sollte es Tondemonai sein. Ich habe einen Kommentar abgegeben. Während der Organisation schrieb ich einen Artikel über die Hauptpunkte des Programms. Wenn Sie einen Artikel wie diesen schreiben, werden Sie ihn nicht vergessen.

Recommended Posts

Mausbedienung mit Windows-API in Python
Versuchen Sie es mit der Wunderlist-API in Python
Versuchen Sie, die Kraken-API mit Python zu verwenden
Verwenden von venv in der Windows + Docker-Umgebung [Python]
Tweet mit der Twitter-API in Python
[Python] [Windows] Serielle Kommunikation in Python über DLL
Holen Sie sich Youtube-Daten in Python mithilfe der Youtube-Daten-API
Evernote-API in Python
C-API in Python 3
Versuchen Sie es mit der BitFlyer Ligntning API in Python
Holen Sie sich die Bild-URL mithilfe der Flickr-API in Python
Lassen Sie uns Emotionen mithilfe der Emotions-API in Python beurteilen
Versuchen Sie, die ChatWork-API und die Qiita-API in Python zu verwenden
Versuchen Sie, die DropBox Core-API mit Python zu verwenden
Hit Mastodons API in Python
Laden Sie eine JPG-Datei mit der Google Drive-API in Python hoch
Grundeinstellungen bei Verwendung der foursquare-API mit Python
Holen Sie sich LEAD-Daten mit der REST-API von Marketo in Python
OpenVINO verwendet die Inference Engine Python API in einer PC-Umgebung
Blender Python API in Houdini (Python 3)
Verwenden Sie die Such-API der National Parliament Library in Python
Python-Installation in 2 Zeilen @Windows
Übersetzt mit Googletrans in Python
Verwenden des Python-Modus in der Verarbeitung
Prognostizieren Sie das Geschlecht anhand des Namens mithilfe der Gender-API und von Pykakasi in Python
[Python] Mit Tkinter mehrere Fenster anzeigen
GUI-Programmierung in Python mit Appjar
Abrufen der arXiv-API in Python
Vorsichtsmaßnahmen bei der Verwendung von Pit mit Python
Drücken Sie einen Befehl in Python (Windows)
Datenerfassung mit Python Googlemap API
Setzen Sie MeCab in "Windows 10; Python3.5 (64bit)"
Klicken Sie in Python auf die Sesami-API
[Python3] Google übersetzt Google Übersetzung ohne Verwendung von API
Versuchen Sie es mit der Pleasant-API (Python / FastAPI).
Versuchen Sie es mit LevelDB mit Python (plyvel)
Windows 10: Installieren der MeCab-Bibliothek für Python
Erstellen Sie Google Mail in Python ohne Verwendung der API
Verwendung globaler Variablen in Python-Funktionen
Klicken Sie auf die Web-API in Python
Mal sehen, wie man Eingaben in Python verwendet
Gesamtleistung in Python (mit Funktools)
Versuchen Sie es mit der Aktions-API von Python argparse
Implementieren Sie die REST-API schnell in Python
Führen Sie Ansible über Python mithilfe der API aus
Handschriftliche Zeichenerkennung mit KNN in Python
Greifen Sie mit Python auf die Twitter-API zu
Versuchen Sie es mit LeapMotion mit Python
Suche nach Tiefenpriorität mit Stack in Python
[Python] Dateivorgang mit der if-Anweisung
Bei Verwendung regulärer Ausdrücke in Python
GUI-Erstellung in Python mit tkinter 2
[SEO] Flow / Beispielcode bei Verwendung der Google Analytics-API in Python
Hinweise zur Verwendung von OpenCV mit Windows 10 Python 3.8.3.
Hinweise zur Verwendung von cChardet und python3-chardet in Python 3.3.1.
GUI-Erstellung in Python mit tkinter Teil 1
Holen Sie sich Suica Balance in Python (mit libpafe)
Übung, dies in Python zu verwenden (schlecht)
Hash-Passwörter langsam mit bcrypt in Python