详解基于C#开发Windows API的SendMessage方法的鼠标键盘消息发送
在C#中,
SendMessage
方法是一个强大的工具,它允许我们与Windows API交互,模拟键盘和鼠标事件。本文将详细介绍如何使用SendMessage
方法来发送鼠标和键盘消息。
1. SendMessage方法概述
SendMessage
是Windows API中的一个函数,它用于向指定的窗口发送消息。这些消息可以是键盘或鼠标事件、数据传递等。在C#中,我们可以通过P/Invoke来调用这个函数。
2. 引入所需的命名空间
在使用SendMessage
之前,我们需要引入System.Runtime.InteropServices
命名空间,它包含了与非托管代码交互所需的类和方法。
using System.Runtime.InteropServices;
3. 定义Windows API函数
我们需要定义SendMessage
函数的原型,以及相关的常量和结构体。
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
4. 鼠标消息发送
4.1 鼠标点击事件
发送鼠标点击事件,包括MouseDown和MouseUp。
const int WM_LBUTTONDOWN = 0x0201;
const int WM_LBUTTONUP = 0x0202;public static void SendMouseClick(IntPtr hwnd, int X, int Y)
{int lParam = (Y << 16) + X;SendMessage(hwnd, WM_LBUTTONDOWN, 0, lParam);SendMessage(hwnd, WM_LBUTTONUP, 0, lParam);
}
4.2 鼠标移动事件
发送鼠标移动事件。
const int WM_MOUSEMOVE = 0x0200;public static void SendMouseMove(IntPtr hwnd, int X, int Y)
{int lParam = (Y << 16) + X;SendMessage(hwnd, WM_MOUSEMOVE, 0, lParam);
}
4.3 鼠标滚轮事件
发送鼠标滚轮事件。
const int WM_MOUSEWHEEL = 0x020A;public static void SendMouseWheel(IntPtr hwnd, int X, int Y, int delta)
{int lParam = (Y << 16) + X;SendMessage(hwnd, WM_MOUSEWHEEL, delta, lParam);
}
5. 键盘消息发送
5.1 键盘按键事件
发送键盘按键事件,包括KeyDown和KeyUp。
const int WM_KEYDOWN = 0x0100;
const int WM_KEYUP = 0x0101;public static void SendKey(IntPtr hwnd, int keyCode, bool isDown)
{if (isDown){SendMessage(hwnd, WM_KEYDOWN, keyCode, 0);}else{SendMessage(hwnd, WM_KEYUP, keyCode, 0);}
}
5.2 特殊按键
发送特殊按键,如Ctrl、Alt、Shift等。
const int VK_CONTROL = 0x11;
const int VK_SHIFT = 0x10;
const int VK_MENU = 0x12; // Alt键public static void SendSpecialKey(IntPtr hwnd, int keyCode, bool isDown)
{SendKey(hwnd, keyCode, isDown);
}
5.3 组合键
发送组合键,如Ctrl+C。
public static void SendCombinationKey(IntPtr hwnd, int key1, int key2)
{SendSpecialKey(hwnd, VK_CONTROL, true);SendKey(hwnd, key1, true);SendKey(hwnd, key2, true);SendKey(hwnd, key2, false);SendKey(hwnd, key1, false);SendSpecialKey(hwnd, VK_CONTROL, false);
}
6. 多线程和异步发送
在多线程环境中,SendMessage
可能会导致线程阻塞,因此推荐使用PostMessage
来异步发送消息。
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern bool PostMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
7. 实际应用示例
以下是一个实际应用示例,模拟在记事本中输入文本“Hello, World!”。
IntPtr notepadHandle = FindWindow("Notepad", null);
if (notepadHandle != IntPtr.Zero)
{SendText(notepadHandle, "Hello, World!");SendKey(notepadHandle, (int)'V', true); // 模拟按下'V'键,即粘贴SendKey(notepadHandle, (int)'V', false);
}
通过上述代码,我们可以看到SendMessage
方法在C#中如何用于模拟键盘和鼠标事件,实现对目标窗口的控制。这种方法在自动化测试、游戏辅助、UI自动化等领域有着广泛的应用。
后记
鼠标和键盘是计算机系统中最基本的输入设备,它们的重要性体现在以下几个方面:
-
用户交互:鼠标和键盘是用户与计算机进行交互的主要方式。通过它们,用户可以向计算机输入指令、数据和信息,进行各种操作。
-
工作效率:鼠标和键盘的设计使得用户可以快速、准确地进行操作,极大地提高了工作效率。例如,使用快捷键可以快速执行常用命令,而鼠标的点击和拖拽操作可以简化文件管理等任务。
-
软件操作:大多数软件和应用程序都依赖于鼠标和键盘来实现其功能。无论是文档编辑、图像处理还是游戏娱乐,鼠标和键盘都是不可或缺的工具。
-
无障碍访问:对于残障人士来说,特定的键盘和鼠标(如语音识别键盘、触控板鼠标等)可以提供无障碍访问,使他们能够使用计算机。
-
多任务处理:在多任务处理中,鼠标和键盘的使用可以让用户在不同的应用程序和窗口之间快速切换,提高多任务处理能力。
-
游戏和娱乐:在游戏和娱乐领域,鼠标和键盘提供了直观的操作方式,增强了用户的沉浸感和游戏体验。
-
教育和培训:在教育和培训中,鼠标和键盘是学习计算机技能的基础工具,对于学生和专业人士来说都是必不可少的。
-
技术发展:随着技术的发展,鼠标和键盘也在不断进化,如无线鼠标、人体工程学键盘等,它们提供了更多的便利和舒适性。
-
数据输入:在需要大量数据输入的场景中,键盘的打字速度和准确性是其他输入方式难以比拟的。
-
编程和开发:对于开发者来说,键盘是编写代码的主要工具,而鼠标则用于辅助操作和调试。
总之,鼠标和键盘是现代计算机使用中不可或缺的一部分,它们极大地丰富了我们的数字生活,并在工作、学习和娱乐等多个领域发挥着重要作用。
相关文章:

详解基于C#开发Windows API的SendMessage方法的鼠标键盘消息发送
在C#中,SendMessage方法是一个强大的工具,它允许我们与Windows API交互,模拟键盘和鼠标事件。本文将详细介绍如何使用SendMessage方法来发送鼠标和键盘消息。 1. SendMessage方法概述 SendMessage是Windows API中的一个函数,它用…...
VMware安装黑苹果后ICLOUD_UNSUPPORTED_DEVICE(不支持的Icloud设备)
修改文件 关闭虚拟机找到虚拟机文件中以.vmx结尾的文件编辑内容(补充缺失) board-id "Mac-551B86E5744E2388" hw.model.reflectHost "FALSE" hw.model "MacBookPro14,3" serialNumber.reflectHost "FALSE"…...

Python | Leetcode Python题解之第542题01矩阵
题目: 题解: class Solution:def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]:m, n len(matrix), len(matrix[0])# 初始化动态规划的数组,所有的距离值都设置为一个很大的数dist [[10**9] * n for _ in range(m)]…...

【计算机网络】【传输层】【习题】
计算机网络-传输层-习题 文章目录 10. 图 5-29 给出了 TCP 连接建立的三次握手与连接释放的四次握手过程。根据 TCP 协议的工作原理,请填写图 5-29 中 ①~⑧ 位置的序号值。答案技巧 注:本文基于《计算机网络》(第5版)吴功宜、吴英…...
【LeetCode】【算法】55. 跳跃游戏
LeetCode 99 - 55. 跳跃游戏 题目 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回true;否则,返回 …...

华为:hcia综合实验
一、拓扑图 二、实验要求 1. pc地址请自行规划,vlan已给出 2. 服务器地址自行规划,vlan,网段已给出 3. 交换机互联链路捆绑保证冗余性 4. 内网pc网关集中于核心交换机,交换机vlan 40互联路由器 ,地址网段已给出 5.配置静态路由实…...
MyBatis与MyBatis-Plus(基础)
MyBatis-Plus的优势 在 Spring Data JPA 已经很方便的情况下,有时仍然选择使用 MyBatis-Plus 的核心原因主要有以下三点: 1. 复杂 SQL 控制能力更强 MyBatis-Plus 允许直接编写和优化 SQL,适合复杂查询、精细化 SQL 控制的场景。特别是在性…...
一文总结java语法规则
1. 题记 Java是一门拥有较强语法规则的编程语言,本博文主要总结介绍java语言的java语法规则。 2. java语法规则 2.1 标识符(Identifiers) 定义:标识符是用来给变量、类、方法、接口等命名的字符序列。规则: –标识…...

使用 npm 安装 Yarn
PS E:\WeChat Files\wxid_fipwhzebc1yh22\FileStorage\File\2024-11\spid-admin\spid-admin> yarn install yarn : 无法将“yarn”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后…...
vue3中利用路由信息渲染菜单栏
1. 创建路由时将路由信息对象进行抽离 将路由信息对象单独抽离到router/routes.ts文件 关键:利用路由元信息meta,定义3个属性 hidden:控制当前路由是否显示在菜单栏中title:菜单拦名称icon:对应菜单名称前面的图标 …...

Mysql每日一题(行程与用户,困难※)
今天给大家分享一个截止到目前位置,我遇到最难的一道mysql题目,非常建议大家亲手做一遍 完整代码如下,这道题的主要难点是它有两个外键,以前没遇到过,我也没当回事,分享一下错误经验哈 当时我写的where判断…...
adb 命令 查找启动的包名以及导出安装包
查看安卓内包名 adb 查看所有安装的包 adb shell pm list packages查看安装的第三方app的包名 adb shell pm list packages -3查看启动的app的包名 adb shell dumpsys activity top | find "ACTIVITY"adb shell dumpsys activity activities | findstr "Run…...

Flink_DataStreamAPI_输出算子Sink
Flink_DataStreamAPI_输出算子Sink 1连接到外部系统2输出到文件3输出到Kafka4输出到MySQL(JDBC)5自定义Sink输出 Flink作为数据处理框架,最终还是要把计算处理的结果写入外部存储,为外部应用提供支持。 1连接到外部系统 Flink的D…...
标准C++ 字符串
一、标准库中的字符串类型 在C中,字符串是一个非常重要的数据类型,用于表示和处理文本信息。C提供了多种方式来处理字符串,每种方式都有其特点和适用场景。以下是几种常见的字符串类型及其用法: 1. C 风格字符串 (char* 或 char…...

时序预测:多头注意力+宽度学习
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...

day06(单片机)IIC+STH20
目录 IICSHT20 I2C基础简介 为什么I2C需要使用上拉电阻? I2C特点 时序图分析 起始信号与终止信号 数据传输时序 字节传输和应答信号 I2C寻址 主机给从机发送一个字节 主机给从机发送多个字节 主机从从机接收一个字节 主机从从机接收多个字节 I2C寄存器 I2C_RXDR&…...

Bugku CTF_Web——文件上传
Bugku CTF_Web——文件上传 进入靶场 My name is margin,give me a image file not a php抓个包上传试试 改成png也上传失败 应该校验了文件头 增加了文件头也不行 试了一下 把文件类型改成gif可以上传 但是还是不能连接 将Content-Type改大小写 再把文件后缀名改成php4 成…...

C#版使用融合通信API发送手机短信息
目录 功能实现 范例运行环境 实现范例 类设计 类代码实现 调用范例 总结 功能实现 融合云通信服务平台,为企业提供全方位通信服务,发送手机短信是其一项核心功能,本文将讲述如何使用融合云服务API为终端手机用户发送短信信息…...

人工智能:重塑医疗、企业与生活的未来知识管理——以HelpLook为例
一、医疗行业:AI引领的医疗革新 随着人工智能(AI)技术的持续飞跃,我们正身处一场跨行业的深刻变革之中。在医疗健康的广阔舞台上,人工智能技术正扮演着日益重要的角色。它不仅能够辅助医生进行病例的精准诊断…...
MVVM(Model-View-ViewModel)模型
MVVM(ModelViewViewModel)模型是一种常用于软件开发中的架构模式,尤其在前端框架(如 Vue.js、React、Angular)中被广泛应用。它将程序的用户界面与业务逻辑分离,便于维护和扩展。 MVVM 的三个组成部分 1. …...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...

Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...