首页 > 解决方案 > Python按键模拟干扰系统击键

问题描述

我在尝试编写一个在 Minecraft 上自动行走、运行和移动的程序时遇到了这个问题,问题是当我试图让它运行或移动时,它会干扰 Windows 按键。我该如何预防?

这是代码:

import os
import win32gui as win
from time import sleep
from directkeys import PressKey, ReleaseKey, KEYS

print("Modes: WALK, RUN, SHIFT")

mode = input("Select AutoKey Mode> ")
print(f"Selected mode: {mode}")
if mode == "RUN":
    print("RUN mode has some issues that could make your start menu open when you pause/unpause MC, and other keystrokes may not work")

while True:
    title = win.GetWindowText(win.GetForegroundWindow())
    #print(title)

    if "Minecraft " in title:
        if mode == "WALK":
            PressKey(KEYS.W)
        elif mode == "RUN":
            PressKey(KEYS.W)
            PressKey(KEYS.LCTRL)
        elif mode == "SHIFT":
            PressKey(KEYS.SHIFT)
    else:
        ReleaseKey(KEYS.W)
        ReleaseKey(KEYS.LCTRL)
        ReleaseKey(KEYS.SHIFT)
    sleep(0.10)

这是directkeys模块的代码:

import ctypes
import time

class KEYS:
    W = 0x11
    A = 0x1E
    S = 0x1F
    D = 0x20
    LCTRL = 0x1D
    SHIFT = 0x2A

SendInput = ctypes.windll.user32.SendInput

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

# directx scan codes http://www.gamespp.com/directx/directInputKeyboardScanCodes.html

if __name__ == '__main__':
    while (True):
        PressKey(0x11)
        time.sleep(1)
        ReleaseKey(0x11)
        time.sleep(1)

有人可以帮我吗,我真的不知道如何解决这个问题!

标签: pythonkeypress

解决方案


推荐阅读