우리는 오래 전에 내 자신을 여행했습니다. 우리가 여기서 많이 배워야 할 것은 우리가 발견 한 것입니다 :
게임이 DirectX에서 실행 중일 때 보내는 가상 키는 무시됩니다. sendinput을 사용하고 대신 scan_codes를 보냅니다.
# http://www.gamespp.com/directx/directInputKeyboardScanCodes.html
import ctypes
import time
SendInput = ctypes.windll.user32.SendInput
W = 0x11
A = 0x1E
S = 0x1F
D = 0x20
Z = 0x2C
UP = 0xC8
DOWN = 0xD0
LEFT = 0xCB
RIGHT = 0xCD
ENTER = 0x1C
# C struct redefinitions
PUL = ctypes.POINTER(ctypes.c_ulong)
class KeyBdInput(ctypes.Structure):
_fields_ = [("wVk", ctypes.c_ushort),
("wScan", ctypes.c_ushort),
("dwFlags", ctypes.c_ulong),
("time", ctypes.c_ulong),
("dwExtraInfo", PUL)]
class HardwareInput(ctypes.Structure):
_fields_ = [("uMsg", ctypes.c_ulong),
("wParamL", ctypes.c_short),
("wParamH", ctypes.c_ushort)]
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", PUL)]
class Input_I(ctypes.Union):
_fields_ = [("ki", KeyBdInput),
("mi", MouseInput),
("hi", HardwareInput)]
class Input(ctypes.Structure):
_fields_ = [("type", ctypes.c_ulong),
("ii", Input_I)]
# Actuals Functions
def pressKey(hexKeyCode):
extra = ctypes.c_ulong(0)
ii_ = Input_I()
ii_.ki = KeyBdInput(0, hexKeyCode, 0x0008, 0, ctypes.pointer(extra))
x = Input(ctypes.c_ulong(1), ii_)
ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))
def releaseKey(hexKeyCode):
extra = ctypes.c_ulong(0)
ii_ = Input_I()
ii_.ki = KeyBdInput(0, hexKeyCode, 0x0008 | 0x0002, 0,
ctypes.pointer(extra))
x = Input(ctypes.c_ulong(1), ii_)
ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))
if __name__ == '__main__':
pressKey(0x11)
time.sleep(1)
releaseKey(0x11)
time.sleep(1)
출처 : Simulate Python keypresses for controlling a game http://www.gamespp.com/directx/directInputKeyboardScanCodes.html
은 기계 학습에 멋진 튜토리얼 당신에게 Sentdex 감사드립니다. 저는이 게임을 제가 좋아하는 게임으로하고 싶었지만 (DirectX 덕분에) 키를 가져올 수 없었습니다.
다음 단계 : 키 누름을 에뮬레이트하는 Windows 드라이버 키트 ... 게임을 자동화하는 것은 비 윤리적 인 것으로 간주되지만
, 당신은 여기 자습서를 찾을 수 있습니다 http://code.tutsplus.com/tutorials/how-to -build-a-python-bot-that-can-play-web-games - active-11117 – lucasg
감사합니다. 나는 게임을 자동화하는 것이 비 윤리적 인 방법을 볼 수 있으며, 그런 방법을 가르쳐주는 사람은 눈살을 찌푸리게됩니다. autohotkey와 같은 도구를 사용하여 이미 게임을 자동화 할 수 있지만 나를 매료시키는 것은 사람들이 autohotkey와 같은 소프트웨어를 만들 수있는 방법입니다. 내 다음 실험에서는 PYAHK를 사용하여 게임에서 작동하는지 확인하지만 이는 만족스럽지 않습니다. autohotkey뿐만 아니라 키 스트로크를 시뮬레이트 할 수있는 소프트웨어를 만들려고합니다. 또한 그 링크에 대해 감사드립니다. 나는 그 동안 잠시 일했고 많은 것을 배웠다. 그러나 DirectX 게임에서는이 예제의 주요 스트로크가 무시됩니다. – Student
방금 게임에 sendkeys를 차단하는 안티 치트 시스템이 있음을 알았습니다. 여러 가지 방법으로 키 스트로크를 시뮬레이션하는 방법을 배웠다는 것에 감사드립니다. 이제이 새로운/오래된 문제를 해결하는 방법을 알아 내야 만합니다 ... – Student