当前位置:首页 > AI技术 > 正文内容

C#怎么模拟鼠标点击 C#如何调用WindowsAPI干货最佳实践|Duuu笔记

admin6天前AI技术14

优先使用 SendInput 模拟鼠标点击,因其兼容高 DPI、多显示器和 UIPI;若必须用 mouse_event,需归一化坐标至 0–65535 并用 MOUSEEVENTF_ABSOLUTE。

怎么用

mouse_event

模拟鼠标点击(C#)

Windows API 的

mouse_event

已废弃,但仍在 .NET Framework 项目中常见。它不区分高 DPI 缩放,也不支持多显示器坐标偏移,直接调用容易点偏或失效。

实操建议:

优先改用

SendInput

—— 它是微软当前推荐的输入模拟方式,兼容 DPI、多屏、UIPI(用户界面特权隔离)

若必须用

mouse_event

,确保传入屏幕绝对坐标(

MOUSEEVENTF_ABSOLUTE

),且把坐标归一化到 0–65535 范围:

(int)(x * 65535.0 / screen.Width)

不要在 WPF 或 WinForms 的 UI 线程里直接调用,避免被 UI 线程挂起或触发安全拦截;建议用

Task.Run

包一层

C# 调用

SendInput

的最小可用写法

SendInput

需要构造

INPUT

结构体,最容易出错的是字段对齐、

dwType

类型误设、以及未清零 padding 字段导致内存越界。

关键点:

INPUT

必须用

[StructLayout(LayoutKind.Sequential)]

,且显式指定

SizeConst = 28

(x64 下)或

24

(x86)

鼠标事件必须设

dwType = 0

,然后用

dwFlags

组合:比如左键按下是

MOUSEEVENTF_LEFTDOWN

,抬起是

MOUSEEVENTF_LEFTUP

坐标参数

dx

/

dy

是相对还是绝对,取决于是否设置了

MOUSEEVENTF_ABSOLUTE

;绝对坐标下单位是 0–65535,不是像素

调用前检查返回值:如果

SendInput

返回 0,说明输入被系统拦截(如锁屏、UAC 提权窗口前台)或结构体格式错误

示例片段(仅左键单击):

var input = new INPUT { type = 0, mi = new MOUSEINPUT { dx = 10000, dy = 10000, dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN } };

SendInput(1, ref input, INPUT.Size);

input.mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTUP;

SendInput(1, ref input, INPUT.Size);

为什么模拟点击在远程桌面或最小化窗口里经常失效

不是代码写错了,而是 Windows 的输入模型限制:默认情况下,

SendInput

mouse_event

只能向「当前活动桌面」和「前台进程」投递输入。远程桌面会切到自己的会话桌面,而程序最小化时通常失去前台焦点。

白瓜AI

白瓜AI,一个免费图文AI创作工具,支持 AI 仿写,图文生成,敏感词检测,图片去水印等等。

下载

应对方式:

确认目标窗口是否处于活跃桌面(

GetThreadDesktop

+

OpenInputDesktop

可查,但需权限)

SetForegroundWindow

+

BringWindowToTop

尝试激活目标窗口(不一定成功,尤其跨会话或高完整性级别进程)

真正可靠的方案是注入目标进程并调用其内部消息循环(如

PostMessage

发送

WM_LBUTTONDOWN

),但这需要目标窗口句柄和消息结构知识,且受 UIPI 限制

自动化测试场景建议换用 UI Automation(

System.Windows.Automation

),它绕过输入队列,直接调用控件的

InvokePattern

WPF/WinForms 程序里别用 API 模拟点击来“触发按钮逻辑”

这是最常被忽略的陷阱:你用

SendInput

点了界面上的按钮,但按钮的

Click

事件根本没执行。因为 UI 框架的事件是靠消息泵解析

WM_COMMAND

或路由事件触发的,API 级点击只产生原始鼠标消息,不走框架事件链。

正确做法:

WinForms:直接调用

button.PerformClick()

WPF:获取按钮的

ICommand

或手动触发

button.RaiseEvent(new RoutedEventArgs(Button.ClickEvent))

只有当你确实需要测试「真实鼠标行为」(比如验证鼠标坐标响应、拖拽反馈、第三方控件兼容性)时,才动用 Windows API

跨进程、跨会话、高 DPI、UAC、多显示器——这些不是边缘情况,是日常环境。API 模拟点击不是“写完就能跑”,得先想清楚你要模拟的是「输入动作」本身,还是「点击带来的业务效果」。后者几乎永远有更稳的替代路径。

相关文章

使用 ESP

针对该分类问题,我们使用了 Kaggle 手势识别数据集 中的一个开源数据集。原始数据集包括 10 个类别,我们只使用了其中 6 个。这些类别更容易识别,且日常生活中更有用,如...

【DL】2023年你应该知道的 10 大深度学习算法

3. 循环神经网络 (RNN) 4. 生成对抗网络 (GAN) 5. 径向基函数网络 (RBFN) 6. 多层感知器 (MLP) 7. 自组织图 (SOM)...

神经网络中的单层神经网络

神经网络是一种模拟人脑的神经网络以期能够实现类人工智能的机器学习技术。人脑中的神经网络是一个非常复杂的组织。成人的大脑中估计有1000亿个神经元之多。 看一个经典的神经网络。这是一个包...

推荐10个AI人工智能技术网站

除了研究和开发人工智能技术,OpenAI还积极参与人工智能伦理和安全的研究和探讨。 认为,人工智能技术的发展必须遵循伦理和法律的规范,以确保人工智能的应用不会对人类带来负面影响。...

跨平台机器学习:ML.NET架构及应用编程

平台上的一个机器学习框架,它提供了一套丰富的算法和工具,使得开发人员可以轻松地构建和部署机器学习模型。支持多种编程语言,包括等,这使得它成为跨平台机器学习的理想选择。的架构主要包括三个部分:数据读取、...

深入理解优化:如何利用 Gemini 3.1 的阶梯计费策略?企业级大规模调用实务完全指南|Duuu笔记

需深入理解Gemini 3.1阶梯计费与调用联动关系,通过识别阶梯区间、请求级Token预估截断、多模型路由调度、响应缓存去重、项目拆分配额绑定五种路径优化成本。 ☞☞☞AI 智能聊天, 问答助手,...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。