C# 实现对指定句柄的窗口进行键盘输入的实现

在C#中实现对指定句柄的窗口进行键盘操作,可以通过多种方式来实现。以下是一篇详细的指南,介绍如何在C#中实现这一功能。

1. 使用Windows API函数

在这里插入图片描述

在C#中,我们可以通过P/Invoke调用Windows API来实现对指定窗口的键盘操作。以下是一些关键的步骤和代码示例。
在这里插入图片描述

1.1 引入必要的命名空间

首先,你需要在你的C#项目中引入System.Windows.FormsSystem.Runtime.InteropServices命名空间。

using System.Windows.Forms;
using System.Runtime.InteropServices;
1.2 声明Windows API函数

接下来,你需要声明一些Windows API函数,这些函数将用于发送键盘事件到指定的窗口。

[DllImport("user32.dll", SetLastError = true)]
static extern uint SendInput(uint nInputs, ref INPUT pInputs, int cbSize);

[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);

const int WM_KEYDOWN = 0x0100;
const int WM_KEYUP = 0x0101;
1.3 定义INPUT结构体

INPUT结构体用于定义键盘事件。

[StructLayout(LayoutKind.Sequential)]
public struct INPUT
{
    public uint type;
    public INPUT_UNION u;
};

public struct INPUT_UNION
{
    public KEYBDINPUT ki;
}

public struct KEYBDINPUT
{
    public short wVk;
    public short wScan;
    public uint dwFlags;
    public uint time;
    public IntPtr dwExtraInfo;
}
1.4 实现键盘事件发送

在这里插入图片描述

通过SendInput函数发送键盘事件到指定窗口。

public void SimulateKeyPress(char keyChar, IntPtr windowHandle)
{
    INPUT inputDown = new INPUT();
    INPUT inputUp = new INPUT();

    inputDown.type = 1; // INPUT_KEYBOARD
    inputDown.u.ki.wVk = 0;
    inputDown.u.ki.wScan = (ushort)keyChar;
    inputDown.u.ki.dwFlags = 0;
    inputDown.u.ki.time = 0;
    inputDown.u.ki.dwExtraInfo = IntPtr.Zero;

    inputUp = inputDown;
    inputUp.u.ki.dwFlags = 64; // KEYEVENTF_KEYUP

    SendInput(1, ref inputDown, Marshal.SizeOf(typeof(INPUT)));
    SendInput(1, ref inputUp, Marshal.SizeOf(typeof(INPUT)));

    SendMessage(windowHandle, WM_KEYDOWN, (int)keyChar, 0);
    SendMessage(windowHandle, WM_KEYUP, (int)keyChar, 0);
}

2. 使用SendKeys类

另一种简单的方法是使用System.Windows.Forms.SendKeys类,但它通常用于WinForms应用程序中,并且是异步的。

richTextBox1.Focus();
SendKeys.SendWait("(ABCDEFG)");
SendKeys.SendWait("{LEFT 5}");
SendKeys.SendWait("{H 10}");

3. 使用InputSimulator库

InputSimulator是一个第三方库,它提供了模拟键盘和鼠标输入的功能。使用这个库可以方便地在代码中模拟用户的键盘按键和鼠标操作。

using WindowsInput;
InputSimulator simulator = new InputSimulator();
simulator.Keyboard.KeyDown(VirtualKeyCode.VK_A);
simulator.Keyboard.KeyUp(VirtualKeyCode.VK_A);
simulator.Keyboard.TextEntry("Hello, World!");

4. 注意事项

  • 在使用这些方法之前,请确保目标窗口是可以接收键盘输入的。
  • 发送按键消息可能会受到目标应用程序的安全机制的限制。
  • 发送消息的频率和时机需要根据具体应用的需求来调整,以避免引起应用程序的反感或异常行为。
    在这里插入图片描述

总结

通过上述方法,我们可以在C#中实现对指定句柄的窗口进行键盘操作。这些技术可以用于自动化测试、模拟用户操作等多种场景。选择合适的方法取决于具体的应用需求和环境。
在这里插入图片描述


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

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

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

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

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

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

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

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/913123.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GitHub个人主页美化

效果展示 展示为静态效果,动态效果请查看我的GitHub页面 创建GitHub仓库 创建与GitHub用户名相同的仓库,当仓库名与用户名相同时,此仓库会被视作特殊仓库,其README.md(自述文件)会展示在GitHub个人主页…

2024-09-01 - 分布式集群网关 - LoadBalancer - 阿里篇 - 流雨声

摘要 通过公有云部署创建类似 MateLB 的应用负载,可以更加方便的对系统资源进行合理规划。 应用实践 CCM提供Kubernetes与阿里云基础产品(例如CLB、VPC等)对接的能力,支持在同一个CLB后端挂载集群内节点和集群外服务器&#xf…

【销帮帮-注册_登录安全分析报告-试用页面存在安全隐患】

联通支付注册/登录安全分析报告 前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨…

初识Linux · 匿名管道

目录 前言: 匿名管道 理解为什么? 理解是什么? 理解怎么做? 前言: 引入管道之前,我们引入几个问题,进程通信的相关问题。 第一个是进程之间为什么要通信,对于进程间通信来说&…

Linux(CentOS)设置防火墙开放8080端口,运行jar包,接收请求

1、查看防火墙状态 systemctl status firewalld 防火墙开启状态 2、运行 jar 包,使用8080端口 程序正常启动 3、使用 postman 发送请求,失败 4、检查端口是否开放(需更换到 root 用户) firewall-cmd --zonepublic --query-por…

window11安装elasticsearch+Kibana

1、下载elasticsearch与elasticsearch 下载elasticsearch 查看elasticsearch对应的Kibana版本 下载elasticsearch解压后文件目录如下 可执行脚本文件,包括启动elasticsearch服务、插件管理、函数命令等 bin配置文件目录,如elasticsearch配置、角色配置、jvm配置等 conf 默认…

[单例模式]

[设计模式] 设计模式是软件工程中的一种常见做法, 它可以理解为"模板", 是针对一些常见的特定场景, 给出的一些比较好的固定的解决方案. 不同语言适用的设计模式是不一样的. 这里我们接下来要谈到的是java中典型的设计模式. 而且由于设计模式比较适合有一定编程经…

MethodChannel插件的用法

文章目录 1 知识回顾2 示例代码3 经验总结我们在上一章回中介绍了通道相关的内容,本章回中将介绍其中的一种通道:MethodChannnel.闲话休提,让我们一起Talk Flutter吧。 1 知识回顾 我们在上一章回中介绍了通道的概念和作用,并且提到了通道有不同的类型,本章回将其中一种通…

Golang | Leetcode Golang题解之第554题砖墙

题目: 题解: func leastBricks(wall [][]int) int {cnt : map[int]int{}for _, widths : range wall {sum : 0for _, width : range widths[:len(widths)-1] {sum widthcnt[sum]}}maxCnt : 0for _, c : range cnt {if c > maxCnt {maxCnt c}}retur…

通讯录(C 语言)

目录 一、通讯录设计思路1. 伪代码设计思路2. 代码设计思路 二、代码实现三、程序运行演示四、整体分析 一、通讯录设计思路 1. 伪代码设计思路 通讯录可以用来存储 100 个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址。 提供方法&#x…

深入解析四种核心网络设备:集线器、桥接器、路由器和交换机

计算机网络系列课程《网络核心设备》 在现代网络技术中,集线器、桥接器、路由器和交换机扮演着至关重要的角色。本文,将深入探讨这四种设备的功能、工作原理及其在网络架构中的重要性。 集线器:基础网络连接设备 集线器(Hub&…

01 Oracle 数据库存储结构深度解析:从数据文件到性能优化的全链路探究

文章目录 Oracle 数据库存储结构深度解析:从数据文件到性能优化的全链路探究一、Oracle存储结构的物理层次1.1 控制文件(Control File)1.2 联机重做日志文件(Online Redo Log File)1.3 数据文件(Data File&…

Type-C转DP线方案

在现代数字化生活中,高清视频传输已成为日常需求的重要组成部分。无论是工作中的多屏协作,还是娱乐中的沉浸式体验,高清显示器都扮演着不可或缺的角色。然而,随着设备接口的多样化,如何高效地将Type-C设备连接至Displa…

【c++篇】:栈、队列、优先队列:容器世界里的秩序魔法 - stack,queue与priority_queue探秘

✨感谢您阅读本篇文章,文章内容是个人学习笔记的整理,如果哪里有误的话还请您指正噢✨ ✨ 个人主页:余辉zmh–CSDN博客 ✨ 文章所属专栏:c篇–CSDN博客 文章目录 前言一.容器stack1.介绍2.成员函数3.模拟实现4.注意事项 二.容器qu…

Java基础——循环switch大数值更改器访问器深浅拷贝

目录 1.循环 2.switch多分支选择结构 3.大数值 4.浅拷贝&深拷贝 5.Arrays.sort排序 6.面向对象 7.更改器&访问器 1.循环 for-each循环 在 Java 中,for-each 循环(也称为增强型 for 循环)是一种用于遍历数组或集合&#xff08…

引入 axios,根据 api 文档生成调用接口

起步 | Axios Docs 安装 axios npm install axios 生成 api 调用接口【可选】 https://github.com/ferdikoomen/openapi-typescript-codegen 安装 npm install openapi-typescript-codegen --save-dev 然后执行生成代码 # http://localhost:8805/api/user/v3/api-docs&a…

wsl2+Ubuntu安装图形化界面(VNC方式)

本章教程,记录在wsl2+Ubuntu操作系统中安装可视化界面步骤。 一、安装桌面环境 尽量以root用户进行安装,避免因权限不足导致部分依赖无法安装。 sudo apt update sudo apt upgrade -y sudo apt install ubuntu-desktop由于可视化桌面程序安装包比较大,网速慢的小伙伴,需要耐…

Linux应用——线程池

1. 线程池要求 我们创建线程池的目的本质上是用空间换取时间,而我们选择于 C 的类内包装原生线程库的形式来创建,其具体实行逻辑如图 可以看到,整个线程池其实就是一个大型的 CP 模型,接下来我们来完成它 2. 整体模板 #pragma …

学习日记_241110_局部线性嵌入(Locally Linear Embedding, LLE)

前言 提醒: 文章内容为方便作者自己后日复习与查阅而进行的书写与发布,其中引用内容都会使用链接表明出处(如有侵权问题,请及时联系)。 其中内容多为一次书写,缺少检查与订正,如有问题或其他拓展…

【我的 Anti-AV 学习手札】DLL注入

无敌舍友s神免杀学了一个阶段,达者为师,向s师傅学习!! ps:我的基础实在薄弱,WIN编程甚至都没做过,所以笔记翔实些 一、注入思路 1.在进程中开辟一段空间 2.存入dll绝对路径地址的字符串 3.使用…