Нажатие виртуальной клавиши Python не работает - PullRequest
0 голосов
/ 09 марта 2019

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

Вот мой код:

import ctypes,time

user32 = ctypes.windll.user32

def word_to_keybdinput(word):
    for letter in word:
        if letter in ("0","1","2","3","4","5","6","7","8","9"):
            hex_str = hex(ord(letter)-18)
            hex_int = int(hex_str,0)
            #two lines above change number
            #into hex for virtual key code

        user32.keybd_event(hex_int,0,2,0) #2 is the code for KEYDOWN
        user32.keybd_event(hex_int,0,0,0) #0 is the code for KEYUP

time.sleep(2)

start = 1
end = 10000

for i in range(start,end):
    word_to_keybdinput(str(i))

    user32.keybd_event(0x0D,0,2,0) 
    user32.keybd_event(0x0D,0,0,0)
    time.sleep(2.3)

Это предназначено длявведите число, символ за символом, затем нажмите ввод, чтобы отправить его.Часть ввода работает, но номер не отображается вообще.

1 Ответ

0 голосов
/ 10 марта 2019

Попробуйте этот код для отправки входных данных.Я взял это почти 1: 1 из другого вопроса.К сожалению, у меня больше нет ссылки, но я знаю, что она работает.

import ctypes, time

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 KeyDown(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 KeyRelease(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))

def PressKey(hexKeyCode):
    """
    Send a keypress using scancodes
    http://www.gamespp.com/directx/directInputKeyboardScanCodes.html
    """
    KeyDown(hexKeyCode)
    time.sleep(0.05)
    KeyRelease(hexKeyCode)

Пример:

time.sleep(1)
PressKey(0x1C)
PressKey(0x02)
...