我們有一段漫長的旅程,我的過去的自我。雖然我們在這裏有很多要學習的是我們發現的:
如果遊戲在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)。
下一步: 驅動程序開發工具包來模擬按鍵...
雖然自動化遊戲被認爲是不道德的,你可以在這裏找到一個教程:http://code.tutsplus.com/tutorials/how-to -build-a-python-bot-that-play-web-games - active-11117 – lucasg 2014-09-04 11:15:48
謝謝。我可以看到自動化遊戲是不道德的,一個人會皺眉教我這樣的方法。我已經可以使用像autohotkey這樣的工具自動化遊戲了,但讓我着迷的是人們如何創建像autohotkey這樣的軟件。我的下一個實驗將使用PYAHK來看它是否適用於遊戲,但是,這不會讓我滿意。我想嘗試創建可以模擬按鍵和autohotkey的軟件。也感謝你的鏈接。我經歷了一段時間,並且學到了很多東西。但是,該示例中的關鍵筆劃在DirectX遊戲中被忽略。 – Student 2014-09-04 15:38:35
我剛剛瞭解到,遊戲中有一個阻止sendkey的反作弊系統。我很感謝我學會了以各種方式模擬擊鍵。現在我必須弄清楚如何解決這個新老問題...... – Student 2014-09-04 15:44:54