当前位置: 首页 > news >正文

详解基于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自动化等领域有着广泛的应用。
在这里插入图片描述


后记

鼠标和键盘是计算机系统中最基本的输入设备,它们的重要性体现在以下几个方面:

  1. 用户交互:鼠标和键盘是用户与计算机进行交互的主要方式。通过它们,用户可以向计算机输入指令、数据和信息,进行各种操作。

  2. 工作效率:鼠标和键盘的设计使得用户可以快速、准确地进行操作,极大地提高了工作效率。例如,使用快捷键可以快速执行常用命令,而鼠标的点击和拖拽操作可以简化文件管理等任务。

  3. 软件操作:大多数软件和应用程序都依赖于鼠标和键盘来实现其功能。无论是文档编辑、图像处理还是游戏娱乐,鼠标和键盘都是不可或缺的工具。

  4. 无障碍访问:对于残障人士来说,特定的键盘和鼠标(如语音识别键盘、触控板鼠标等)可以提供无障碍访问,使他们能够使用计算机。

  5. 多任务处理:在多任务处理中,鼠标和键盘的使用可以让用户在不同的应用程序和窗口之间快速切换,提高多任务处理能力。

  6. 游戏和娱乐:在游戏和娱乐领域,鼠标和键盘提供了直观的操作方式,增强了用户的沉浸感和游戏体验。

  7. 教育和培训:在教育和培训中,鼠标和键盘是学习计算机技能的基础工具,对于学生和专业人士来说都是必不可少的。

  8. 技术发展:随着技术的发展,鼠标和键盘也在不断进化,如无线鼠标、人体工程学键盘等,它们提供了更多的便利和舒适性。

  9. 数据输入:在需要大量数据输入的场景中,键盘的打字速度和准确性是其他输入方式难以比拟的。

  10. 编程和开发:对于开发者来说,键盘是编写代码的主要工具,而鼠标则用于辅助操作和调试。

总之,鼠标和键盘是现代计算机使用中不可或缺的一部分,它们极大地丰富了我们的数字生活,并在工作、学习和娱乐等多个领域发挥着重要作用。

相关文章:

详解基于C#开发Windows API的SendMessage方法的鼠标键盘消息发送

在C#中&#xff0c;SendMessage方法是一个强大的工具&#xff0c;它允许我们与Windows API交互&#xff0c;模拟键盘和鼠标事件。本文将详细介绍如何使用SendMessage方法来发送鼠标和键盘消息。 1. SendMessage方法概述 SendMessage是Windows API中的一个函数&#xff0c;它用…...

VMware安装黑苹果后ICLOUD_UNSUPPORTED_DEVICE(不支持的Icloud设备)

修改文件 关闭虚拟机找到虚拟机文件中以.vmx结尾的文件编辑内容&#xff08;补充缺失&#xff09; board-id "Mac-551B86E5744E2388" hw.model.reflectHost "FALSE" hw.model "MacBookPro14,3" serialNumber.reflectHost "FALSE"…...

Python | Leetcode Python题解之第542题01矩阵

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

【计算机网络】【传输层】【习题】

计算机网络-传输层-习题 文章目录 10. 图 5-29 给出了 TCP 连接建立的三次握手与连接释放的四次握手过程。根据 TCP 协议的工作原理&#xff0c;请填写图 5-29 中 ①~⑧ 位置的序号值。答案技巧 注&#xff1a;本文基于《计算机网络》&#xff08;第5版&#xff09;吴功宜、吴英…...

【LeetCode】【算法】55. 跳跃游戏

LeetCode 99 - 55. 跳跃游戏 题目 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回true&#xff1b;否则&#xff0c;返回 …...

华为:hcia综合实验

一、拓扑图 二、实验要求 1. pc地址请自行规划&#xff0c;vlan已给出 2. 服务器地址自行规划&#xff0c;vlan&#xff0c;网段已给出 3. 交换机互联链路捆绑保证冗余性 4. 内网pc网关集中于核心交换机&#xff0c;交换机vlan 40互联路由器 ,地址网段已给出 5.配置静态路由实…...

MyBatis与MyBatis-Plus(基础)

MyBatis-Plus的优势 在 Spring Data JPA 已经很方便的情况下&#xff0c;有时仍然选择使用 MyBatis-Plus 的核心原因主要有以下三点&#xff1a; 1. 复杂 SQL 控制能力更强 MyBatis-Plus 允许直接编写和优化 SQL&#xff0c;适合复杂查询、精细化 SQL 控制的场景。特别是在性…...

一文总结java语法规则

1. 题记 Java是一门拥有较强语法规则的编程语言&#xff0c;本博文主要总结介绍java语言的java语法规则。 2. java语法规则 2.1 标识符&#xff08;Identifiers&#xff09; 定义&#xff1a;标识符是用来给变量、类、方法、接口等命名的字符序列。规则&#xff1a; –标识…...

使用 npm 安装 Yarn

PS E:\WeChat Files\wxid_fipwhzebc1yh22\FileStorage\File\2024-11\spid-admin\spid-admin> yarn install yarn : 无法将“yarn”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&#xff0c;请确保路径正确&#xff0c;然后…...

vue3中利用路由信息渲染菜单栏

1. 创建路由时将路由信息对象进行抽离 将路由信息对象单独抽离到router/routes.ts文件 关键&#xff1a;利用路由元信息meta&#xff0c;定义3个属性 hidden&#xff1a;控制当前路由是否显示在菜单栏中title&#xff1a;菜单拦名称icon&#xff1a;对应菜单名称前面的图标 …...

Mysql每日一题(行程与用户,困难※)

今天给大家分享一个截止到目前位置&#xff0c;我遇到最难的一道mysql题目&#xff0c;非常建议大家亲手做一遍 完整代码如下&#xff0c;这道题的主要难点是它有两个外键&#xff0c;以前没遇到过&#xff0c;我也没当回事&#xff0c;分享一下错误经验哈 当时我写的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&#xff08;JDBC&#xff09;5自定义Sink输出 Flink作为数据处理框架&#xff0c;最终还是要把计算处理的结果写入外部存储&#xff0c;为外部应用提供支持。 1连接到外部系统 Flink的D…...

标准C++ 字符串

一、标准库中的字符串类型 在C中&#xff0c;字符串是一个非常重要的数据类型&#xff0c;用于表示和处理文本信息。C提供了多种方式来处理字符串&#xff0c;每种方式都有其特点和适用场景。以下是几种常见的字符串类型及其用法&#xff1a; 1. C 风格字符串 (char* 或 char…...

时序预测:多头注意力+宽度学习

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…...

day06(单片机)IIC+STH20

目录 IICSHT20 I2C基础简介 为什么I2C需要使用上拉电阻&#xff1f; 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发送手机短信息

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

人工智能:重塑医疗、企业与生活的未来知识管理——以HelpLook为例

一、医疗行业&#xff1a;AI引领的医疗革新 随着人工智能&#xff08;AI&#xff09;技术的持续飞跃&#xff0c;我们正身处一场跨行业的深刻变革之中。在医疗健康的广阔舞台上&#xff0c;人工智能技术正扮演着日益重要的角色。它不仅能够辅助医生进行病例的精准诊断&#xf…...

MVVM(Model-View-ViewModel)模型

MVVM&#xff08;ModelViewViewModel&#xff09;模型是一种常用于软件开发中的架构模式&#xff0c;尤其在前端框架&#xff08;如 Vue.js、React、Angular&#xff09;中被广泛应用。它将程序的用户界面与业务逻辑分离&#xff0c;便于维护和扩展。 MVVM 的三个组成部分 1. …...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...