You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用pywin32监听鼠标点击?当前方案CPU占用过高求优化

用pywin32实现低CPU占用的鼠标侧键监听

你的问题出在忙等待轮询:while True循环会让CPU持续处于满负荷状态,导致占用率飙升。正确的做法是利用Windows的消息机制,通过GetMessage阻塞等待系统发送的鼠标消息,只有当事件触发时程序才会响应,大幅降低CPU占用。

实现代码

import win32api
import win32con
import win32gui

def window_procedure(hwnd, msg, w_param, l_param):
    # 处理鼠标侧键按下事件
    if msg == win32con.WM_XBUTTONDOWN:
        # 判断是哪个侧键被按下
        if (w_param & win32con.XBUTTON1) != 0:
            print("鼠标侧键1(XBUTTON1)被按下")
            # 这里添加你的业务逻辑
        elif (w_param & win32con.XBUTTON2) != 0:
            print("鼠标侧键2(XBUTTON2)被按下")
            # 这里添加你的业务逻辑
    # 处理窗口销毁消息,退出循环
    elif msg == win32con.WM_DESTROY:
        win32api.PostQuitMessage(0)
        return 0
    # 其他消息交给系统默认处理
    return win32gui.DefWindowProc(hwnd, msg, w_param, l_param)

def main():
    # 注册窗口类
    window_class = win32gui.WNDCLASS()
    window_class.lpfnWndProc = window_procedure
    window_class.lpszClassName = "MouseSideKeyListener"
    window_class.hInstance = win32api.GetModuleHandle(None)
    class_atom = win32gui.RegisterClass(window_class)

    # 创建隐藏窗口(无需显示,仅用于接收消息)
    hwnd = win32gui.CreateWindow(
        class_atom, 
        "MouseListenerWindow", 
        0, 0, 0, 0, 0,  # 窗口样式、位置、大小都设为0(隐藏)
        0, 0, window_class.hInstance, None
    )

    # 进入消息循环:GetMessage会阻塞等待消息,无消息时CPU休眠
    msg = win32gui.GetMessage(None, 0, 0)
    while msg[0] != win32con.WM_QUIT:
        win32gui.TranslateMessage(msg)
        win32gui.DispatchMessage(msg)
        msg = win32gui.GetMessage(None, 0, 0)

if __name__ == "__main__":
    main()

关键说明

  • 消息循环机制:GetMessage是阻塞函数,只有当系统有消息(比如鼠标按键事件)时才会返回,程序在空闲时不会占用CPU。
  • 窗口作用:Windows的消息需要绑定到窗口接收,这里创建的是隐藏窗口,不会显示在桌面上,仅作为消息载体。
  • 事件精准触发:直接监听WM_XBUTTONDOWN系统消息,比轮询GetAsyncKeyState更精准,不会出现重复检测或漏检的情况。

内容的提问来源于stack exchange,提问作者Question_283

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 06:35:27