MacOS读取蓝牙摇杆讯号,利用python修改pynput程序码实现 - 3.修改pynput

请参考之前的文章:第二篇

5. 修改pynput

if event_type == Quartz.NSSystemDefined:
    sys_event = Quartz.NSEvent.eventWithCGEvent_(event)
    if sys_event.subtype() == kSystemDefinedEventMediaKeysSubtype:
        # The key in the special key dict; True since it is a media
        # key
        key = ((sys_event.data1() & 0xffff0000) >> 16, True)
        if key in self._SPECIAL_KEYS:
            flags = sys_event.data1() & 0x0000ffff
            is_press = ((flags & 0xff00) >> 8) == 0x0a
            if is_press:
                self.on_press(self._SPECIAL_KEYS[key])
            else:
                self.on_release(self._SPECIAL_KEYS[key])

我们可以发现pyput对data1做以下处理:

key = ((sys_event.data1() & 0xffff0000) >> 16, True)

可以参考 菜鸟教程
& 0xffff0000的作用是将二进制的最後16个数字变为0,>> 16的作用是将二进制的最後16个数字删除
结果如下:

原始数据 转二进制                  & 0xffff0000处理        >>16处理 转回十进制
1051392 0b100000000101100000000 0b100000000000000000000 0b10000 16
1051136 0b100000000101000000000 0b100000000000000000000 0b10000 16

1182208 0b100100000101000000000 0b100100000000000000000 0b10010 18
1182464 0b100100000101100000000 0b100100000000000000000 0b10010 18

1116672 0b100010000101000000000 0b100010000000000000000 0b10001 17
1116928 0b100010000101100000000 0b100010000000000000000 0b10001 17

1313280 0b101000000101000000000 0b101000000000000000000 0b10100 20
1313536 0b101000000101100000000 0b101000000000000000000 0b10100 20

1247744 0b100110000101000000000 0b100110000000000000000 0b10011 19
1248000 0b100110000101100000000 0b100110000000000000000 0b10011 19

接下来

flags = sys_event.data1() & 0x0000ffff
is_press = ((flags & 0xff00) >> 8) == 0x0a

经过处理後:

原始数据 转二进制                 &0x0000ffff处理 >>8处理 转回十进制
1051392 0b100000000101100000000 0b101100000000 0b1011 11
1051136 0b100000000101000000000 0b101000000000 0b1010 10
1182208 0b100100000101000000000 0b101000000000 0b1010 10
1182464 0b100100000101100000000 0b101100000000 0b1011 11
1116672 0b100010000101000000000 0b101000000000 0b1010 10
1116928 0b100010000101100000000 0b101100000000 0b1011 11
1313280 0b101000000101000000000 0b101000000000 0b1010 10
1313536 0b101000000101100000000 0b101100000000 0b1011 11
1247744 0b100110000101000000000 0b101000000000 0b1010 10
1248000 0b100110000101100000000 0b101100000000 0b1011 11

如果转换後为10,表示== 0x0ais_pressTrue

根据pynput的代码,会去调用self._SPECIAL_KEYS,我曾经尝试去Key那边增加20和19,但是这会引发一系列错误,所以我直接在原本的程序码前面多加几行if,结果如下:

elif event_type == Quartz.NSSystemDefined:
    sys_event = Quartz.NSEvent.eventWithCGEvent_(event)
    if sys_event.subtype() == kSystemDefinedEventMediaKeysSubtype:
        # The key in the special key dict; True since it is a media
        # key
        key = ((sys_event.data1() & 0xffff0000) >> 16, True)
#--------------------------以下是我加入的程序码--------------------------
        if key == (19, True): #right
            if ((sys_event.data1() & 0x0000ffff) >> 8) == 0x0a:
                self.on_press("Key.media_right")
        elif key == (20, True): #left
            if ((sys_event.data1() & 0x0000ffff) >> 8) == 0x0a:
                self.on_press("Key.media_left")
#--------------------------以上是我加入的程序码--------------------------
        elif key in self._SPECIAL_KEYS:
            flags = sys_event.data1() & 0x0000ffff
            is_press = ((flags & 0xff00) >> 8) == 0x0a
            if is_press:
                self.on_press(self._SPECIAL_KEYS[key])
            else:
                self.on_release(self._SPECIAL_KEYS[key])

如果处理过後的数字为19或20,则分别回传"Key.media_right"和"Key.media_left"

最後我们在写操控程序的时候要注意到,回传的为文字,而不是原来的物件了

from pynput.keyboard import Key, Listener, Controller
keyboard = Controller()

def on_press(key):
    if key == Key.media_previous: #上
        keyboard.press(Key.up)
    elif key == Key.media_next:  #下
        keyboard.press(Key.down)
    elif key == "Key.media_right": #右
        keyboard.press(Key.right)
    elif key == "Key.media_left": #左
        keyboard.press(Key.left)
    listener.stop()

if __name__ == '__main__':
    while True: 
        with Listener(on_press = on_press_j) as listener:
            listener.join()

<<:  MacOS读取蓝牙摇杆讯号,利用python修改pynput程序码实现 - 2.研究 pynput

>>:  Android 不负责任系列 - Jetpack 组件、MVVM 架构,简称 AAC、整洁架构(Clean Architecture) 的领域层(Domain Layer) UseCase 介绍

提升会议效率的开会技巧

软件开发中的所有角色,产品经理可以说是会议前几名多的角色,而且很常要担任主持会议的角色,因为产品经理...

[Day 10] Reactive Programming - Reactor (generate & create)

前言 之前介绍产生Flux 的方法都是固定的遵循特定逻辑的,若今天有需要客制化特殊的逻辑来产生资料,...

Day 30-完赛心得

实作成果: (今过长时间的debug终於成功了 ) 不知不觉就30天了 从一开始的不适应,到现在习惯...

[ Day 21 ] - 认识 JS 原生写法处理 AJAX

JS 原生写法处理 AJAX XMLHttpRequest 透过建立一个XMLHttpRequest...

D12 - 「数位×IN×OUT」:建立控制组件

再来就是实际建立透过 select 选择的脚位,并建立相关 Firmata 功能。 建立数位控制组件...