Имитировать физическое нажатие клавиш в python, не поднимая флаг LowLevelKeyHookInjected (0x10) - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь смоделировать физическое нажатие клавиш (а именно, F12) в python, не поднимая флаг LowLevelKeyHookInjected (0x10) в Windows.Цель этого - вызвать действие в программе, которая отфильтровывает эмулируемые нажатия клавиш.Эта программа является вспомогательной технологией, которая предоставляет альтернативные методы доступа для управления ОС.

Я перепробовал много вариантов, включая SendKeys, pyauotogui, pynput, ctype и т. Д. *

Если я нажимаю физическиF12, я могу инициировать соответствующее действие, однако, имитация нажатия и отпускания F12 через python с использованием описанных выше методов не работает.Вот пример того, что я пробовал:

import pynput.keyboard import Key, Controller
import time
Keyboard = Controller()
keyboard.press(Key.f12)
time.sleep(.05)
keyboard.release(Key.f12)

Итак, он просто имитирует нажатие клавиши f12, ждет 0,05 с, затем отпускает клавишу.

Я использую Python 3.6.6 в Windows

Заранее благодарю за помощь!

1 Ответ

0 голосов
/ 11 февраля 2019

Это то, что я использовал, когда у меня была такая же проблема несколько дней назад.Это немного грязно, но это делает работу.:)

import ctypes
from ctypes import wintypes
import time
user32 = ctypes.WinDLL('user32', use_last_error=True)
INPUT_KEYBOARD = 1
KEYEVENTF_EXTENDEDKEY = 0x0001
KEYEVENTF_KEYUP       = 0x0002
KEYEVENTF_UNICODE     = 0x0004
MAPVK_VK_TO_VSC = 0
# msdn.microsoft.com/en-us/library/dd375731
wintypes.ULONG_PTR = wintypes.WPARAM
class MOUSEINPUT(ctypes.Structure):
    _fields_ = (("dx",          wintypes.LONG),
                ("dy",          wintypes.LONG),
                ("mouseData",   wintypes.DWORD),
                ("dwFlags",     wintypes.DWORD),
                ("time",        wintypes.DWORD),
                ("dwExtraInfo", wintypes.ULONG_PTR))
class KEYBDINPUT(ctypes.Structure):
    _fields_ = (("wVk",         wintypes.WORD),
                ("wScan",       wintypes.WORD),
                ("dwFlags",     wintypes.DWORD),
                ("time",        wintypes.DWORD),
                ("dwExtraInfo", wintypes.ULONG_PTR))
    def __init__(self, *args, **kwds):
        super(KEYBDINPUT, self).__init__(*args, **kwds)
        if not self.dwFlags & KEYEVENTF_UNICODE:
            self.wScan = user32.MapVirtualKeyExW(self.wVk,
                                                 MAPVK_VK_TO_VSC, 0)
class HARDWAREINPUT(ctypes.Structure):
    _fields_ = (("uMsg",    wintypes.DWORD),
                ("wParamL", wintypes.WORD),
                ("wParamH", wintypes.WORD))
class INPUT(ctypes.Structure):
    class _INPUT(ctypes.Union):
        _fields_ = (("ki", KEYBDINPUT),
                    ("mi", MOUSEINPUT),
                    ("hi", HARDWAREINPUT))
    _anonymous_ = ("_input",)
    _fields_ = (("type",   wintypes.DWORD),
                ("_input", _INPUT))
LPINPUT = ctypes.POINTER(INPUT)
def PressKey(hexKeyCode):
    x = INPUT(type=INPUT_KEYBOARD,
              ki=KEYBDINPUT(wVk=hexKeyCode))
    user32.SendInput(1, ctypes.byref(x), ctypes.sizeof(x))
def ReleaseKey(hexKeyCode):
    x = INPUT(type=INPUT_KEYBOARD,
              ki=KEYBDINPUT(wVk=hexKeyCode,
                            dwFlags=KEYEVENTF_KEYUP))
   user32.SendInput(1, ctypes.byref(x), ctypes.sizeof(x))
def F12():
    PressKey(0x7B)
    time.sleep(0.5)
    ReleaseKey(0x7B)
    # you can change 0x30 to any key you want. For more info look at :
    # msdn.microsoft.com/en-us/library/dd375731


F12()

Просто используйте F12 () для симуляции клавиши F12.

Если вы хотите симулировать и другие клавиши, вы можете изменить положение, где 0x7B в функции F12, на другое(посмотрите в msdn.microsoft.com/en-us/library/dd375731, чтобы узнать, какие ключи имеют какое значение).Для имитации писем это также может помочь быстро конвертировать:

def toKeyCode(c):
    keyCode = keyCodeMap[c[0]]
    return keyCode

keyCodeMap = {
    'shift'             : "0x10",
    '0'                 : "0x30",
    '1'                 : "0x31",
    '2'                 : "0x32",
    '3'                 : "0x33",
    '4'                 : "0x34",
    '5'                 : "0x35",
    '6'                 : "0x36",
    '7'                 : "0x37",
    '8'                 : "0x38",
    '9'                 : "0x39",
    'a'                 : "0x41",
    'b'                 : "0x42",
    'c'                 : "0x43",
    'd'                 : "0x44",
    'e'                 : "0x45",
    'f'                 : "0x46",
    'g'                 : "0x47",
    'h'                 : "0x48",
    'i'                 : "0x49",
    'j'                 : "0x4A",
    'k'                 : "0x4B",
    'l'                 : "0x4C",
    'm'                 : "0x4D",
    'n'                 : "0x4E",
    'o'                 : "0x4F",
    'p'                 : "0x50",
    'q'                 : "0x51",
    'r'                 : "0x52",
    's'                 : "0x53",
    't'                 : "0x54",
    'u'                 : "0x55",
    'v'                 : "0x56",
    'w'                 : "0x57",
    'x'                 : "0x58",
    'y'                 : "0x59",
    'z'                 : "0x5A",
}

(также это мой первый пост, так что, если я что-то напутал, извините: D)

...