Симулиране на натискане на клавиш в 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
Може ли да е GUI? Опитайте 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