def __init__(self, device=None): """ device: /dev/input/eventX, default: all keyboard. """ self._hotkey_list = [] self._hotkey_seq_dict = {} self.devices = [] mouses, kbms = libkbm.getkbm() if len(kbms) <= 0: raise HotKeyError("没有发现至少一个键盘。") if device is None: self.kbms = kbms else: if device not in kbms: raise ValueError(f"{device} 不是键盘设备。") else: self.kbms = device self.LISTEN = 1 self.REPLACE = 2 self._mode = self.LISTEN # 把device注册到selectors self._selector = DefaultSelector() self._fileobjs = [] for device in self.kbms: fd = open(device, "rb") devfd = Device(fd) self._selector.register(devfd.fd, EVENT_READ, devfd) self._fileobjs.append(fd)
def __init__(self): self.device = Device() self.device.name = "Virtual Keyboard Mouse" self.__add_mouse_keyboard_events() self.uinput = self.device.create_uinput_device() self._delay = 0.01
def create_device(self): self.device = Device() self.device.name = "Virtual Keyboard Mouse" self.__add_mouse_keyboard_events() self.uinput = self.device.create_uinput_device() # 在创建虚拟输入设备后等一秒,马上使用设备, # 会导致事件不生效。 sleep(1)
def get_device(device_path: str) -> Device: """Safely get an evdev device handle.""" fd = open(device_path, 'rb') evdev = Device(fd) try: yield evdev finally: fd.close()
def registers(kbms): selector = selectors.DefaultSelector() for kbm in kbms: print("加入:", kbm) fd = os.open(kbm, os.O_NONBLOCK | os.O_RDONLY) fdobj = open(fd, "rb") #fcntl.fcntl(fd, fcntl.F_SETFL, os.O_NONBLOCK) device = Device(fdobj) selector.register(device.fd, selectors.EVENT_READ, data=device) return selector
def getkbm(baseinput="/dev/input"): mouses = [] keyboards = [] for dev in os.listdir(baseinput): devpath = path.join(baseinput, dev) if not path.isdir(devpath): devfd = open(devpath, 'rb') else: continue try: device = Device(devfd) except (OSError, Exception) as e: logger.info("打开 {} 异常:{}".format(dev, e)) continue if device.name == "Virtual Keyboard Mouse": continue #if device.has(EV_REL.REL_X) device.has(EV_REL.REL_Y and device.has(EV_KEY.BTN_LEFT) and device.has(EV_KEY.BTN_RIGHT) and device.has(EV_KEY.BTN_MIDDLE) and device.has(EV_KEY.WHEEL): MOUSE = [ EV_REL.REL_X, EV_REL.REL_Y, EV_REL.REL_WHEEL, EV_KEY.BTN_LEFT, EV_KEY.BTN_RIGHT, EV_KEY.BTN_MIDDLE ] KEYBOARD = [ EV_KEY.KEY_ESC, EV_KEY.KEY_SPACE, EV_KEY.KEY_BACKSPACE, EV_KEY.KEY_0, EV_KEY.KEY_A, EV_KEY.KEY_Z, EV_KEY.KEY_9, EV_KEY.KEY_F2 ] if all(map(device.has, MOUSE)): logger.info("应该是鼠标了: {} 路径:{}".format(device.name, device.fd)) mouses.append(devpath) elif all(map(device.has, KEYBOARD)): logger.info("应该是键盘了: {} 路径:{}".format(device.name, device.fd)) keyboards.append(devpath) else: logger.info("其他输入设备:", device.name, "路径:", device.fd) devfd.close() return (mouses, keyboards)
def registers(kbms): selector = selectors.DefaultSelector() for kbm in kbms: print("加入:", kbm) fd = os.open(kbm, os.O_NONBLOCK | os.O_RDONLY) #fd = os.open(kbm, os.O_NONBLOCK | os.O_RDWR) fdobj = open(fd, "rb") device = Device(fdobj) if MODE == REPLACE: #uinput.grab() pass elif MODE == LISTEN: pass selector.register(device.fd, selectors.EVENT_READ, data=device) return selector
if keyboard_detected != 2: print("Can't find keyboard, code " + str(keyboard_detected)) if touchpad_detected != 2: print("Can't find touchpad, code " + str(touchpad_detected)) if touchpad_detected == 2 and not device_id.isnumeric(): print("Can't find device id") sys.exit(1) else: break sleep(0.1) # Start monitoring the touchpad # fd_t = open('/dev/input/event' + str(touchpad), 'rb') fcntl(fd_t, F_SETFL, O_NONBLOCK) d_t = Device(fd_t) # Retrieve touchpad dimensions # ai = d_t.absinfo[EV_ABS.ABS_X] (minx, maxx) = (ai.minimum, ai.maximum) ai = d_t.absinfo[EV_ABS.ABS_Y] (miny, maxy) = (ai.minimum, ai.maximum) # Start monitoring the keyboard (numlock) # fd_k = open('/dev/input/event' + str(keyboard), 'rb') fcntl(fd_k, F_SETFL, O_NONBLOCK) d_k = Device(fd_k) # Create a new keyboard device to send numpad events # dev = Device() dev.name = "Asus Touchpad/Numpad" dev.enable(EV_KEY.KEY_KP1)