Python中macOS键盘模拟中的移位字符?

时间:2017-08-02 04:46:00

标签: python terminal macos-sierra keycode

所以我有一个Python程序,让我可以在不使用键盘的情况下输入我在程序中编写的任何内容。它基本上使用键码模拟Mac键盘。但是,我不知道如何模拟大写字母。另外,我想使用字符'>',但我只能找到它的Unicode。任何人都可以帮我找到大写字母的单独密钥代码,或找到一些让我同时使用shift和字母的方法,以便出现大写字母?

如果没有办法让这种情况发生,那么有人可以告诉我如何为每个字符而不是密钥代码使用Unicode吗?

如果有人对我的意思感到困惑,可以参加以下计划:

#!/usr/bin/python
# Script simulating keyboard events in macOS.
# See: https://stackoverflow.com/q/13564851/55075

import sys
import time
import string
from Quartz.CoreGraphics import CGEventCreateKeyboardEvent
from Quartz.CoreGraphics import CGEventPost
from Quartz.CoreGraphics import kCGHIDEventTap
#from Quartz.CoreGraphics import CFRelease # Python releases things automatically.

class Keyboard():
  shiftChars = {
    '~': '`',
    '!': '1',
    '@': '2',
    '#': '3',
    '$': '4',
    '%': '5',
    '^': '6',
    '&': '7',
    '*': '8',
    '(': '9',
    ')': '0',
    '_': '-',
    '+': '=',
    '{': '[',
    '}': ']',
    '|': '\\',
    ':': ';',
    '"': '\'',
    '<': ',',
    '>': '.',
    '?': '/'
  }


  keyCodeMap = {
    'a'              : 0x00,
    's'              : 0x01,
    'd'              : 0x02,
    'f'              : 0x03,
    'h'              : 0x04,
    'g'              : 0x05,
    'z'              : 0x06,
    'x'              : 0x07,
    'c'              : 0x08,
    'v'              : 0x09,
    'b'              : 0x0B,
    'q'              : 0x0C,
    'w'              : 0x0D,
    'e'              : 0x0E,
    'r'              : 0x0F,
    'y'              : 0x10,
    't'              : 0x11,
    '1'              : 0x12,
    '2'              : 0x13,
    '3'              : 0x14,
    '4'              : 0x15,
    '6'              : 0x16,
    '5'              : 0x17,
    '='              : 0x18,
    '9'              : 0x19,
    '7'              : 0x1A,
    '-'              : 0x1B,
    '8'              : 0x1C,
    '0'              : 0x1D,
    ']'              : 0x1E,
    'o'              : 0x1F,
    'u'              : 0x20,
    '['              : 0x21,
    'i'              : 0x22,
    'p'              : 0x23,
    'l'              : 0x25,
    'j'              : 0x26,
    '\''             : 0x27,
    'k'              : 0x28,
    ';'              : 0x29,
    '\\'             : 0x2A,
    ','              : 0x2B,
    '/'              : 0x2C,
    'n'              : 0x2D,
    'm'              : 0x2E,
    '.'              : 0x2F,
    '~'              : 0x32,
    'k.'             : 0x41,
    'k*'             : 0x43,
    'k+'             : 0x45,
    'kclear'         : 0x47,
    'k/'             : 0x4B,
    'k\n'            : 0x4C,
    'k-'             : 0x4E,
    'k='             : 0x51,
    'k0'             : 0x52,
    'k1'             : 0x53,
    'k2'             : 0x54,
    'k3'             : 0x55,
    'k4'             : 0x56,
    'k5'             : 0x57,
    'k6'             : 0x58,
    'k7'             : 0x59,
    'k8'             : 0x5B,
    'k9'             : 0x5C,

    # keycodes for keys that are independent of keyboard layout
    '\n'             : 0x24,
    '\t'             : 0x30,
    ' '              : 0x31,
    'del'            : 0x33,
    'delete'         : 0x33,
    'esc'            : 0x35,
    'escape'         : 0x35,
    'cmd'            : 0x37,
    'command'        : 0x37,
    'shift'          : 0x38,
    'caps lock'      : 0x39,
    'option'         : 0x3A,
    'ctrl'           : 0x3B,
    'control'        : 0x3B,
    'right shift'    : 0x3C,
    'rshift'         : 0xFFFF,
    'right option'   : 0x3D,
    'roption'        : 0x3D,
    'right control'  : 0x3E,
    'rcontrol'       : 0x3E,
    'fun'            : 0x3F,
    'function'       : 0x3F,
    'f17'            : 0x40,
    'volume up'      : 0x48,
    'volume down'    : 0x49,
    'mute'           : 0x4A,
    'f18'            : 0x4F,
    'f19'            : 0x50,
    'f20'            : 0x5A,
    'f5'             : 0x60,
    'f6'             : 0x61,
    'f7'             : 0x62,
    'f3'             : 0x63,
    'f8'             : 0x64,
    'f9'             : 0x65,
    'f11'            : 0x67,
    'f13'            : 0x69,
    'f16'            : 0x6A,
    'f14'            : 0x6B,
    'f10'            : 0x6D,
    'f12'            : 0x6F,
    'f15'            : 0x71,
    'help'           : 0x72,
    'home'           : 0x73,
    'pgup'           : 0x74,
    'page up'        : 0x74,
    'forward delete' : 0x75,
    'f4'             : 0x76,
    'end'            : 0x77,
    'f2'             : 0x78,
    'page down'      : 0x79,
    'pgdn'           : 0x79,
    'f1'             : 0x7A,
    'left'           : 0x7B,
    'right'          : 0x7C,
    'down'           : 0x7D,
    'up'             : 0x7E
  }

  # See: https://stackoverflow.com/q/3202629/55075
  def toKeyCode(self, c):
    shiftKey = False
    # Letter
    if c.isalpha():
        if not c.islower():
            shiftKey = True
            c = c.lower()
    if c in Keyboard.shiftChars:
        shiftKey = True
        c = Keyboard.shiftChars[c]
    if c in Keyboard.keyCodeMap:
        keyCode = Keyboard.keyCodeMap[c]
    else:
        keyCode = ord(c)
    return keyCode, shiftKey

  def KeyDown(self, k):
    keyCode, shiftKey = self.toKeyCode(k)

    time.sleep(0.0001)

    if shiftKey:
        CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, 0x38, True))
        time.sleep(0.0001)

    CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, keyCode, True))
    time.sleep(0.0001)

    if shiftKey:
        CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, 0x38, False))
        time.sleep(0.0001)

  def KeyUp(self, k):
    keyCode, shiftKey = self.toKeyCode(k)

    time.sleep(0.0001)

    CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, keyCode, False))
    time.sleep(0.0001)

  def KeyPress(self, k):
    keyCode, shiftKey = self.toKeyCode(k)

    time.sleep(0.0001)

    if shiftKey:
        CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, 0x38, True))
        time.sleep(0.0001)

    CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, keyCode, True))
    time.sleep(0.0001)

    CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, keyCode, False))
    time.sleep(0.0001)

    if shiftKey:
        CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, 0x38, False))
        time.sleep(0.0001)

  def Type(self, text):
    for key in text:
        self.KeyDown(key)
        self.KeyUp(key)

  def click(self, x):
    self.KeyDown(x)
    self.KeyUp(x)

# DEMO
if __name__ == '__main__':
    keyboard = Keyboard()
    if sys.platform == "darwin":
        keyboard.Type('Hello world!')
        keyboard.click('>')

编辑:我不知道为什么这会被贬低。这是一个合理的问题,我需要答案来完成我正在制作的这个项目。任何建议都会非常有帮助。如果有人知道为什么这会被低估,你能否在评论中解释一下?

1 个答案:

答案 0 :(得分:0)

我希望List of Virtual Key Codes可以帮助您找到答案。