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.
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.
Es gibt zwei Möglichkeiten, die Maus mit der Win32-API zu bedienen.
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.
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))
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.
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