WSL2 中 pynput 无法捕获按键输入?

视频链接:https://www.bilibili.com/video/BV1vCmiB1ENV/?vd_source=5ba34935b7845cd15c65ef62c64ba82f

你是否遇到过在 WSL2 中,pynput 无响应,无法捕获键盘的输入?

WSL2 本质是 Linux 内核子系统,无法直接访问 Windows 的硬件输入,通过输入 ls /dev 发现实际是没有 input,这里有两种方式:

  1. 通过 usb 重定向给 WSL2 也可以实现,比如之前用过的 WSL USB Manager 工具
  1. Linux 下的 pynput 依赖 X11/Xorg(显示服务器)实现全局键盘监听,无 GUI 环境(X Server)时,pynput 无法注册 / 捕获任何键盘事件,所以随便创建一个 X11 显示窗口即可

    import threading
    import tkinter as tk

    def startGui():
    root = tk.Tk()
    root.title("WSL2 X11 Bridge")
    root.geometry("1x1")
    root.iconify()
    root.mainloop()

    def runGuiThread():
    gui_thread = threading.Thread(target=startGui, daemon=True)
    gui_thread.start()

完整测试代码如下:

复制代码
from pynput import keyboard
import time

class KeyListener:
    def __init__(self, key_states, callbackFunc=None):
        self.listener = keyboard.Listener(on_press=self.onPress, on_release=self.onRelease)
        self.key_states = key_states
        self.callbackFunc = callbackFunc

    def join(self):
        self.listener.join()

    def start(self):
        self.listener.start()

    def stop(self):
        self.listener.stop()

    def onPress(self, key):
        if key in self.key_states:
            self.key_states[key] = True

        if key == keyboard.Key.esc:
            return False

    def onRelease(self, key):
        if key in self.key_states:
            self.key_states[key] = False

    def callbackFunc(self):
        pass

def test_callback():
    print('test_callback')

if __name__ == '__main__':
    key_states = {
        keyboard.Key.up: False,
        keyboard.Key.down: False,
        keyboard.Key.left: False,
        keyboard.Key.right: False,
        keyboard.Key.alt_l: False,
        keyboard.Key.alt_r: False,
    }
    key_listener = KeyListener(key_states, callbackFunc=test_callback)
    key_listener.start()

    import threading,tkinter as tk
    def startGui():
        root = tk.Tk()
        root.title("WSL2 X11 Bridge")
        root.geometry("1x1")
        root.iconify()
        root.mainloop()

    def runGuiThread():
        gui_thread = threading.Thread(target=startGui, daemon=True)
        gui_thread.start()

    runGuiThread()

    while True:
        if key_states[keyboard.Key.up]:
            print('up')
        if key_states[keyboard.Key.down]:
            print('down')
        if key_states[keyboard.Key.left]:
            print('left')
        if key_states[keyboard.Key.right]:
            print('right')
        if key_states[keyboard.Key.alt_l]:
            print('alt_l')
        if key_states[keyboard.Key.alt_r]:
            print('alt_r')
        time.sleep(0.01)
    key_listener.join() 
相关推荐
玩大数据的龙威4 小时前
农经权二轮延包—全面取代人工公示图生成
python·arcgis
IT_Octopus4 小时前
JSON 日志里的 `{“$ref“:“$.xxx“}`:从 fastjson 兼容包到原生 fastjson2 的迁移实录
开发语言·python·json
geovindu5 小时前
python:HandWriting Recognition using paddlepaddle
开发语言·后端·python·paddlepaddle
wuyk5555 小时前
Python 零基础入门第九章:用户输入与 While 循环
开发语言·python
兮动人5 小时前
Python变量与常量
开发语言·python·机器学习·python变量与常量
风筝在晴天搁浅5 小时前
解题代码清爽版
java·开发语言
2601_962300815 小时前
机器学习的理想基石
人工智能·python·机器学习·编程语言·数据处理
Java后端的Ai之路5 小时前
21、Python - 命令模式
开发语言·人工智能·python·命令模式·外观模式
astronautyi5 小时前
Go 运行时内存分配与 GC 位图深度剖析
开发语言·后端·golang
2601_962077986 小时前
机器学习及其Python实践
pytorch·python·机器学习·tensorflow·scikit-learn