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

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

admin2个月前 (04-05)AI技术59

深入理解前端原理,本文探讨

优先使用 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 模拟点击不是“写完就能跑”,得先想清楚你要模拟的是「输入动作」本身,还是「点击带来的业务效果」。后者几乎永远有更稳的替代路径。

相关文章

【深度学习】Java DL4J 2024年度技术总结

一、Java DL4J深度学习概述 1.1 DL4J框架简介 1.2 与其他深度学习框架的比较 1.3 DL4J 的优势 1.3.1 与 Java 生态系统的无...

【大数据分析 | 深度学习】在Hadoop上实现分布式深度学习

一、Submarine(Hadoop生态系统) (一)Submarine 介绍 (三)Submarine 属于 Hadoop 生态系统 (四)Submarine 官网版...

【大模型应用开发

二、大模型的泛化与微调 模型的泛化能力:是指一个模型在面对新的、未见过的数据时,能够正确理解和预测这些数据的能力。在机器学习和人工智能领域,模型的泛化能力是评估模型性能的重要指标之一。...

神经网络分类总结

从网络性能角度可分为连续型与离散型网络、确定性与随机性网络。 从网络结构角度可为前向网络与反馈网络。 从学习方式角度可分为有导师学习网络和无导师学习网络。 按连续突触性...

前端开发高级应用:MuleRun如何连接Slack通知 MuleRun消息推送集成配置步骤实战案例|Duuu笔记

若MuleRun无法向Slack推送通知,需依次配置Incoming Webhook或Bot Token、在MuleRun中设置对应通知目标参数,并通过最小化任务测试验证;常见失败原因包括凭据错误、权...

AI实战详解:Perplexity 怎么做市场调研 Perplexity 市场分析实操教程【商业】最佳实践|Duuu笔记

掌握Perplexity AI市场调研需五步:一、结构化提问嵌入地域/时间/主体/指标四要素;二、限定PDF等原始信源提升可信度;三、分步提问生成制表符分隔文本以自动导入Excel;四、启用Pro S...

发表评论

访客

看不清,换一张

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