Pyautogui не выдает вывод в требуемом окне

#python #windows #pyautogui

#python #Windows #pyautogui

Вопрос:

Итак, я создал программу для перемещения игрока в Minecraft, чтобы серверы не помечали меня как AFK. Код выдает вывод в других приложениях и имитирует клавиатуру. Однако в Minecraft, похоже, он не выдает никаких выходных данных любого рода. Я подозреваю, что это потому, что я переключаюсь в другое окно, но это работало в других приложениях, таких как блокнот. Я пробовал разные тайминги и понял, что проблема не в этом, задержка в том, чтобы дать мне время переключиться на требуемое окно Вот мой код:

 import pyautogui as gui
import time
wait_time = 10
def move_ingame():
    print("moving!")
    gui.press('space', presses=3, interval=1 )
def start_afk():
    print("Starting AFK in {} seconds. Make sure you have MC running and open.".format(wait_time))
    time.sleep(wait_time)
    while True:
        move_ingame()
        time.sleep(30)
def change_wait_time():
    print("Wait time is set to {} seconds. Enter value to change it to.".format(wait_time))
    change_val = input()
    if type(change_val) == int:
        wait_time = change_val
        print("Wait time has been changed to {}".format(wait_time))
        x1 = input("Press enter to go back to main_menu")
    else:
        print("Please enter a valid number. Only integers. No decimals allowed! Im lazy but ill change that soon ;)")
def load_page():
    print("Welcome to Franklin's  server AFK autobot")
    print("Type "q" and press enter to change initial wait time")
    init_input = input()
    if init_input == "Q" or init_input == "q":
        change_wait_time()
    else:
        start_afk()
load_page()
  

Ответ №1:

Вероятно, это связано с тем, что обычный ввод не работает, вам нужен прямой ввод. У меня есть небольшой модуль, который делает подобные вещи, позвольте мне продемонстрировать

directkeys.py:

 import ctypes
import time

SendInput = ctypes.windll.user32.SendInput

W = 0x11
A = 0x1E
S = 0x1F
D = 0x20
M = 0x32
K = 0x25
SPACE = 0x39

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


from ctypes import windll, Structure, c_long, byref


class POINT(Structure):
    _fields_ = [("x", c_long), ("y", c_long)]


def queryMousePosition():
    pt = POINT()
    windll.user32.GetCursorPos(byref(pt))
    return pt
    # return { "x": pt.x, "y": pt.y}/





def click(x, y):
    # convert to ctypes pixels
    # x = int(x * 0.666)
    # y = int(y * 0.666)
    ctypes.windll.user32.SetCursorPos(x, y)
    ctypes.windll.user32.mouse_event(2, 0, 0, 0, 0)  # left down
    ctypes.windll.user32.mouse_event(4, 0, 0, 0, 0)  # left up


def moveMouseTo(x, y):
    # convert to ctypes pixels
    # x = int(x * 0.666)
    # y = int(y * 0.666)
    print(x, y)
    ctypes.windll.user32.SetCursorPos(x, y)
    # ctypes.windll.user32.mouse_event(2, 0, 0, 0, 0)  # left down
    # ctypes.windll.user32.mouse_event(4, 0, 0, 0, 0)  # left up


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

Теперь вы просто заменили бы свои функции pyautogui из directkeys.py .

Позвольте мне привести вам пример:

 from directkeys import PressKey, ReleaseKey, W
import time

def holdW():
    PressKey(W)
    time.sleep(5)
    ReleaseKey(W)
  

Имейте в виду, что если вы нажмете другие клавиши, вам нужно будет выполнить поиск по их соответствующим кодам сканирования клавиш.