许多 Windows 桌面自动化脚本在不同电脑或多显示器环境下会神秘失效,这通常源于其核心 API——SendInput 的陈旧。本文将深入剖析其在权限隔离、输入机制和坐标系方面面临的三大挑战,并介绍一个更为稳定和现代化的底层解决方案,帮助开发者摆脱困扰。
智能速览
SendInput 是陈旧的 API,导致脚本在多显示器或高权限目标下失灵。
UIPI 权限隔离、DirectInput 机制、DPI 缩放是其失效的三大主因。
走向内核驱动是解决输入模拟稳定性的关键思路。
winput 库采用双后端架构,并自动处理 DPI 缩放问题。
该库纯 Go 实现,无外部依赖,编译即用,轻量便捷。
精华内容
SendInput 作为 Windows 自动化的基石,如今却布满陷阱。要真正解决问题,必须深入其三大核心挑战,并寻找更底层的突破路径。
权限与机制的鸿沟
SendInput 的首要挑战来自 Windows Vista 引入的用户界面特权隔离(UIPI)。该机制会阻止低权限进程向高权限进程(如管理员身份运行的程序)发送输入消息,导致脚本“静默失效”,且不会有任何报错提示。
此外,许多现代应用和游戏绕过了 Windows 消息队列,直接通过 DirectInput 或 Raw Input 读取硬件信号。在这种机制下,SendInput 发送的软件层消息就如同被忽略的纸条,无法产生实际效果。
坐标系的数学难题
在多显示器和高 DPI 缩放(如150%)盛行的今天,SendInput 的坐标计算变得极为复杂。逻辑像素与物理像素的分离,加之不同显示器使用不同缩放比例的混合场景,让精准定位变成了一道数学难题。
开发者若不进行复杂的 DPI 感知转换和虚拟桌面映射,鼠标点击和移动的位置必然发生严重偏移,使得自动化操作完全失效。
内核驱动的降维打击
既然用户层的限制难以逾越,最有效的解决方案便是下沉到内核层。通过安装如 Interception 的底层驱动,可以在设备驱动层面拦截并注入真实的硬件输入信号。
这种方式从根本上绕过了 UIPI 和应用层的输入过滤,实现了对任意目标程序的精准、稳定操控,在技术上堪称一种“降维打击”。
winput 的现代实践
基于对上述痛点的理解,winput 库应运而生。它采用双后端架构,开发者可按需在驱动和非驱动模式间一键切换,兼顾了稳定性和易用性。
其核心优势在于内置了自动 DPI 修正机制,并能正确处理多显示器环境。同时,它提供了 DPI 感知的截屏工具,解决了硬件加速导致的黑屏问题。作为纯 Go 语言实现,它无外部依赖,编译即可运行,十分轻量。
Windows 自动化的稳定性根植于对系统底层机制的深刻洞察。从 SendInput 的普遍失效到内核驱动的精准操控,技术演进为开发者提供了更可靠的路径。winput 这类工具的出现,正是对这一趋势的响应,它或许能启发我们去思考,未来的自动化开发将走向何方。