Имитация нажатия клавиши в python

Хорошо, я знаю, что этот вопрос выглядит как дубликат, но я так не думаю. Я читал другие сообщения о поддельных нажатиях клавиш, которые включают ctypes и SendKey. Тем не менее, я пробовал их, и они не работают так, как я хочу. Я не хочу что-то похожее на фактическое нажатие клавиши, я хочу что-то, что делает ТОЧНО то же самое, что и нажатие клавиши. Я провел несколько тестов с ctypes и заметил, что нажатие клавиш ведет себя не так, как реальное нажатие клавиши.

Например, если я открываю блокнот и удерживаю клавишу A, я получаю один символ A, а примерно через секунду он начинает заполняться буквами As. Когда я запускаю PressKey() для A, он набирает одну A и все. Мне все еще нужно запустить ReleaseKey() для A после этого, чтобы другие программы не испортились.

Мне нужен какой-то способ сделать что-то вроде realKeyPress('A') и заставить его вести себя точно так же, как я нажал клавишу A. Кроме того, спасибо, ребята, вы всегда так быстро отвечаете с хорошими ответами!


person Spooky    schedule 12.02.2015    source источник
comment
См. статью здесь.   -  person Malik Brahimi    schedule 13.02.2015
comment
Я не думаю, что это то, что я ищу. Я не хочу иметь возможность перехватывать ввод пользователя, я хочу, чтобы казалось, что пользователь нажал клавишу на клавиатуре.   -  person Spooky    schedule 13.02.2015
comment
Может это графический интерфейс? Попробуйте pygame или Tkinter.   -  person Malik Brahimi    schedule 13.02.2015
comment
Должен ли этот вопрос иметь тег Windows? Кажется, это специфично для Windows...   -  person psmears    schedule 13.02.2015


Ответы (1)


Так что я все-таки использовал ctypes. Я изменил код ctypes после прочтения другого ответа, похожего на эту тему. Вот готовый код:

import ctypes
import time

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))
person Spooky    schedule 12.02.2015