2014-09-04 6 views
3

나는 1 년 동안 여러 가지 일을 해왔다. 나는 초보자 수준의 파이썬이다. Euler 프로젝트의 처음 두 질문을 수행했습니다.pywinauto로 게임에서 키를 시뮬레이트하는 방법

나는 게임에서 키를 시도하고 시뮬레이트하기 위해 몇 가지 방법을 시도했습니다. autohotkey와 매크로 키보드/마우스로이 작업을 쉽게 할 수 있습니다. 그러나, 나는

내 생각 엔이는 Win32 API는 비디오 게임에서 무시된다는 점이다 나는

가 사전에 감사 다이렉트 X를 통해 키 입력을 시뮬레이션 할 필요가 파이썬 또는 C를 통해 이러한 목표를 달성하고 싶습니다. 여기 나의 최근 시도가있다 ... 실패했다.

게임의 새로운 인스턴스를 실행할 때마다 핸들을 잡거나 변경해야합니다.

시뮬레이션 된 키가 브라우저 및 메모장에서 작동하지만 게임에서는 작동하지 않습니다. 작동하지 않으면 사용자 입력이 없음을 의미합니다.

다음 코드는 창으로 전환되지만 사용자 입력을 시뮬레이트하지는 않습니다.

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 드라이버 키트 ... 게임을 자동화하는 것은 비 윤리적 인 것으로 간주되지만

관련 문제