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

如何使用Python在Windows系统中禁用触控板并锁定鼠标指针?

刚好这两个Windows下的Python问题我之前都处理过,给你分享些靠谱的实现方案:

问题1:在Windows系统中用Python禁用触控板

这里有两种实用的方法,你可以根据自己的需求选择:

  • 方法1:使用devcon命令(简单直接,需管理员权限)
    devcon是Windows官方的设备管理命令行工具,能直接禁用/启用硬件设备。步骤如下:

    1. 先打开设备管理器,找到你的触控板设备,右键→属性→详细信息→硬件ID,复制对应的ID(比如HID\VID_XXXX&PID_XXXX&MI_00)
    2. 用Python调用subprocess执行devcon命令:
    import subprocess
    
    # 替换成你复制的触控板硬件ID
    TOUCHPAD_HWID = "HID\\VID_XXXX&PID_XXXX&MI_00"
    
    try:
        # 禁用触控板,需以管理员身份运行脚本
        result = subprocess.run(
            ["devcon", "disable", TOUCHPAD_HWID],
            check=True,
            capture_output=True,
            text=True
        )
        print("触控板已禁用:", result.stdout)
    except subprocess.CalledProcessError as e:
        print(f"禁用失败:{e.stderr}")
    
    # 恢复的话把上面的"disable"改成"enable"即可
    

    注意:devcon属于Windows SDK的一部分,需要自行下载,且脚本必须以管理员权限运行。

  • 方法2:通过Windows API(无需额外工具,更灵活)
    如果你不想用外部工具,可以用ctypes调用Windows的SetupAPI来枚举并禁用触控板设备。这个方法需要处理更多的API细节,但不需要额外安装工具:

    import ctypes
    from ctypes import wintypes
    
    # 初始化相关API
    setupapi = ctypes.WinDLL('setupapi', use_last_error=True)
    cfgmgr32 = ctypes.WinDLL('cfgmgr32', use_last_error=True)
    
    # 定义所需的常量和结构体
    DIGCF_PRESENT = 0x00000002
    DIGCF_DEVICEINTERFACE = 0x00000010
    GUID_DEVINTERFACE_HID = wintypes.GUID("{4D1E55B2-F16F-11CF-88CB-001111000030}")
    
    # 枚举HID设备,找到触控板并禁用
    def disable_touchpad():
        hdevinfo = setupapi.SetupDiGetClassDevsW(ctypes.byref(GUID_DEVINTERFACE_HID), None, None, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE)
        if hdevinfo == wintypes.HANDLE(-1).value:
            raise ctypes.WinError(ctypes.get_last_error())
    
        devinfo_data = wintypes.SP_DEVINFO_DATA()
        devinfo_data.cbSize = ctypes.sizeof(devinfo_data)
        index = 0
        while setupapi.SetupDiEnumDeviceInfo(hdevinfo, index, ctypes.byref(devinfo_data)):
            index += 1
            # 获取设备描述,判断是否是触控板
            buf = ctypes.create_unicode_buffer(256)
            if setupapi.SetupDiGetDeviceRegistryPropertyW(hdevinfo, ctypes.byref(devinfo_data), 0x00000000, None, ctypes.byref(buf), ctypes.sizeof(buf), None):
                if "touchpad" in buf.value.lower():
                    # 禁用设备
                    result = cfgmgr32.CM_Disable_DevNode(devinfo_data.DevInst, 0)
                    if result == 0:
                        print("触控板已通过API禁用")
                    else:
                        print(f"API禁用失败,错误码:{result}")
                    break
        setupapi.SetupDiDestroyDeviceInfoList(hdevinfo)
    
    if __name__ == "__main__":
        disable_touchpad()
    

    这个方法的好处是不需要额外工具,但需要对Windows API有一定了解,且部分设备可能需要管理员权限。

问题2:锁定鼠标指针(包括触控板)

你之前用的BlockInput(True)只对部分输入设备生效,因为它是阻止输入事件传递,但有些触控板驱动会绕过这个限制。更可靠的方法是直接限制鼠标指针的移动范围,用Windows API的ClipCursor函数,不管输入来自USB鼠标还是触控板,指针都被锁在指定区域:

import ctypes
from ctypes import wintypes
import time

user32 = ctypes.WinDLL('user32', use_last_error=True)

# 定义RECT结构体,用于指定鼠标限制区域
class RECT(ctypes.Structure):
    _fields_ = [
        ("left", wintypes.LONG),
        ("top", wintypes.LONG),
        ("right", wintypes.LONG),
        ("bottom", wintypes.LONG)
    ]

# 获取当前鼠标位置
def get_current_cursor_pos():
    pos = wintypes.POINT()
    user32.GetCursorPos(ctypes.byref(pos))
    return pos.x, pos.y

# 锁定鼠标到当前位置(限制在1x1像素区域)
def lock_cursor_in_place():
    x, y = get_current_cursor_pos()
    # 创建一个仅包含当前指针位置的极小矩形
    lock_rect = RECT(x, y, x + 1, y + 1)
    user32.ClipCursor(ctypes.byref(lock_rect))

# 解锁鼠标,恢复正常移动
def unlock_cursor():
    user32.ClipCursor(None)

# 测试:锁定5秒后解锁
if __name__ == "__main__":
    print("鼠标指针将被锁定5秒...")
    lock_cursor_in_place()
    time.sleep(5)
    unlock_cursor()
    print("鼠标已解锁")

为什么这个方法更有效?

ClipCursor是直接限制鼠标指针的移动边界,不管输入来自哪种设备(USB鼠标、触控板甚至远程桌面输入),指针都无法超出指定区域。把区域设成1x1像素,就相当于把指针固定在当前位置,完全符合你的需求,而且不需要处理复杂的输入钩子,也不需要管理员权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 15:12:53