如何使用Python在Windows系统中禁用触控板并锁定鼠标指针?
刚好这两个Windows下的Python问题我之前都处理过,给你分享些靠谱的实现方案:
问题1:在Windows系统中用Python禁用触控板
这里有两种实用的方法,你可以根据自己的需求选择:
方法1:使用devcon命令(简单直接,需管理员权限)
devcon是Windows官方的设备管理命令行工具,能直接禁用/启用硬件设备。步骤如下:- 先打开设备管理器,找到你的触控板设备,右键→属性→详细信息→硬件ID,复制对应的ID(比如
HID\VID_XXXX&PID_XXXX&MI_00) - 用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的一部分,需要自行下载,且脚本必须以管理员权限运行。
- 先打开设备管理器,找到你的触控板设备,右键→属性→详细信息→硬件ID,复制对应的ID(比如
方法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
相关产品推荐
相关产品推荐

