1

PySimpleGui 4.15.1 を使用して python 3.8.1 でゲーム コールド ボクシング シミュレーター 2 のハックのコードを書きました。スタート/ストップ ボタンをクリックしようとすると、GUI はフリーズしますが、スクリプトはスタート/ストップ ボタンに接続されています。まだ実行されます。しかし、Start/Stop ボタンに接続されているスクリプトを Print('Chicken') のようなものに変更すると、完全に機能します</p >

コードは次のとおりです。

import PySimpleGUI as sg
import ctypes
import time
import pynput

sg.theme('DarkBrown1')

layout = [  [sg.Text('BOXING SIMULATOR 2 HACK', size=(20, 2), justification='center')],
            [sg.Text('', size=(10, 2), font=('Helvetica', 20), justification='center', key='_OUTPUT_')],
            [sg.T(' ' * 5), sg.Button('Start/Stop', focus=True), sg.Quit()]]

window = sg.Window('BOXING SIMULATOR 2 HACK', layout)

SendInput = ctypes.windll.user32.SendInput

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)]


def PressKeyPynput(hexKeyCode):
    extra = ctypes.c_ulong(0)
    ii_ = pynput._util.win32.INPUT_union()
    ii_.ki = pynput._util.win32.KEYBDINPUT(0, hexKeyCode, 0x0008, 0, ctypes.cast(ctypes.pointer(extra), ctypes.c_void_p))
    x = pynput._util.win32.INPUT(ctypes.c_ulong(1), ii_)
    SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))

def ReleaseKeyPynput(hexKeyCode):
    extra = ctypes.c_ulong(0)
    ii_ = pynput._util.win32.INPUT_union()
    ii_.ki = pynput._util.win32.KEYBDINPUT(0, hexKeyCode, 0x0008 | 0x0002, 0, ctypes.cast(ctypes.pointer(extra), ctypes.c_void_p))
    x = pynput._util.win32.INPUT(ctypes.c_ulong(1), ii_)
    SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))


HACK_running, counter = False, 0

while True:                                 
    event, values = window.read(timeout=10) 
    if event in (None, 'Quit'):            
        break
    elif event == 'Start/Stop':
        HACK_running = not HACK_running
    if HACK_running:
            PressKeyPynput(0x02)
            time.sleep(0.08)
            ReleaseKeyPynput(0x02)
            PressKeyPynput(0x11)
            time.sleep(0.5)
            ReleaseKeyPynput(0x11)
            PressKeyPynput(0x1F)
            time.sleep(0.6)
            ReleaseKeyPynput(0x1F)
            PressKeyPynput(0x02)
            time.sleep(0.08)
            ReleaseKeyPynput(0x02)
            time.sleep(300)
4

1 に答える 1

1

なんらかのリフレッシュまたは読み取り操作なしでは、GUI で長時間実行されるタスクを実行することはできません。

この投稿と同一の以前の投稿に回答し、問題が終了しない内側の while ループであることを指摘しました。

内部ループを永久に実行する必要がある場合は、少なくとも GUI を更新する必要があります。これを行うには、以下に示すように呼び出しwindow.refreshます。

while True:                                 
    event, values = window.read(timeout=10) 
    if event in (None, 'Quit'):            
        break
    elif event == 'Start/Stop':
        HACK_running = not HACK_running
    if HACK_running:
            PressKeyPynput(0x02)
            time.sleep(0.08)
            ReleaseKeyPynput(0x02)
            PressKeyPynput(0x11)
            time.sleep(0.5)
            ReleaseKeyPynput(0x11)
            PressKeyPynput(0x1F)
            time.sleep(0.6)
            ReleaseKeyPynput(0x1F)
            PressKeyPynput(0x02)
            time.sleep(0.08)
            ReleaseKeyPynput(0x02)
            time.sleep(300)
            window.refresh()

PySimpleGUI イベント ループ内からすべてスリープ状態にしないでください。

より良いアプローチは、window.read(timeout=400)の代わりに呼び出すことですtime.sleep(0.4)。これにより、OS がプログラムがハングしたと認識しなくなります。

于 2020-01-16T03:10:48.993 に答える