2014-09-04 1 views
3

Я пробовал разные вещи в течение года. Я на начальном уровне в python. Были ли первые два вопроса в Project Euler.Как имитировать ключи в игре с pywinauto

Я пробовал несколько методов, чтобы попытаться имитировать ключи в играх, в которые я играю. Я легко могу сделать это с помощью autohotkey и макро-клавиатуры/мыши. Тем не менее, я хотел бы сделать это с помощью Python или C.

Я думаю, что Win32 API игнорируется в видеоиграх, и мне нужно, чтобы имитировать нажатие клавиши через Direct X.

Спасибо заранее. Вот моя последняя попытка ... это провалилось.

Мне нужно захватить/изменить ручку каждый раз, когда я запускаю новый экземпляр игры.

Мои симулированные ключи будут работать в браузере и в блокноте, просто не в игре. Не работая, я имею в виду, что пользователя нет.

Следующий код переключится на окно, но не будет имитировать вход пользователя.

import pywinauto 
import time 
from pywinauto import application 
app = application.Application() 
app.connect_(handle = 0x14002a) 
dialogs = app.windows_(handle = 0x14002a) 
dlg = app.top_window_() 
time.sleep(1) 
app.MapleStory.TypeKeys("%A") 
time.sleep(1) 
app.MapleStory.TypeKeys("%A") 
time.sleep(1) 
app.MapleStory.TypeKeys("%A") 
time.sleep(1) 
app.MapleStory.TypeKeys("%A") 
time.sleep(1) 
app.MapleStory.TypeKeys("%A") 
time.sleep(1) 
app.MapleStory.TypeKeys("%A") 
+0

хотя автоматизация игры считается неэтичным, вы можете найти учебник здесь: http://code.tutsplus.com/tutorials/how-to -build-a-python-bot-that-can-play-web-games - active-11117 – lucasg

+0

Спасибо. Я вижу, как автоматические игры неэтичны, и можно было бы хмуриться, чтобы научить меня таким методам. Я могу уже автоматизировать игры с помощью таких инструментов, как autohotkey, но меня очаровывает то, как люди могут создавать такие программы, как autohotkey. Мой следующий эксперимент будет использовать PYAHK, чтобы увидеть, работает ли он в играх, но это меня не устраивает. Я хотел бы попытаться создать программное обеспечение, которое может имитировать нажатие клавиши, а также autohotkey. Также спасибо за эту ссылку. Я проработал через некоторое время и многому научился. Тем не менее, ключевые штрихи в этом примере игнорируются в играх DirectX. – Student

+0

Я только что узнал, что в игре есть анти-чит-система, которая блокирует sendkeys. Я благодарен за то, что научился симулировать нажатия клавиш разными способами. Теперь я должен выяснить, как обойти эту новую/старую проблему ... – Student

ответ

1

У нас был долгий путь моего прошлого. Хотя нам есть чему поучиться, это то, что мы обнаружили:

Отправка виртуальных ключей будет проигнорирована, если игра запущена на 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 Driver Kit для эмуляции нажатия клавиш ...

Смежные вопросы