WPF学习(8) --Windows API函数的使用
一、API函数的介绍
1.FindWindow函数
[DllImport("user32.dll", CharSet = CharSet.Auto)]public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
- 功能: FindWindow函数用于根据窗口的类名和窗口名称查找窗口的句柄(IntPtr类型)。这个句柄是一个唯一标识窗口的值,用于后续的窗口操作
- 参数:lpClassName: 窗口类名,可以为null,表示忽略类名。lpWindowName: 窗口名称,也可以为null,表示忽略窗口名称
- 返回值: 返回找到的窗口句柄。如果没有找到,则返回IntPtr.Zero
2.GetDlgItem函数
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr GetDlgItem(IntPtr hWnd, int nIDDlgItem);
- 功能: GetDlgItem函数用于从指定的对话框或窗口中获取子窗口(通常是控件)的句柄
- 参数:hWnd: 父窗口或对话框的句柄。nIDDlgItem: 子窗口的控件ID
- 返回值: 返回子窗口的句柄。如果没有找到,则返回IntPtr.Zero
3.SendMessage函数
[DllImport("user32.dll", CharSet = CharSet.Auto)]public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, string lParam);
- 功能: SendMessage函数用于向指定的窗口发送消息,并等待该消息被处理。它可以用来设置控件的文本、模拟用户输入等
- 参数:hWnd: 目标窗口的句柄。Msg: 要发送的消息的类型。wParam: 消息的附加参数,通常用于传递小整数值。lParam: 消息的附加参数,这里使用字符串lParam来传递文本
- 返回值: 返回消息的处理结果,具体值取决于发送的消息类型
4.PostMessage函数
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
- 功能: PostMessage函数也用于向指定窗口发送消息,但它不会等待消息处理完成。消息会被放入消息队列,处理由系统安排
- 参数:hWnd: 目标窗口的句柄。Msg: 要发送的消息的类型。wParam 和 lParam: 附加参数,用于传递消息的数据
- 返回值: 返回true表示消息已成功投递,false表示失败
5.SetForegroundWindow函数
[DllImport("user32.dll", SetLastError = true)]private static extern bool SetForegroundWindow(IntPtr hWnd);
- 功能: SetForegroundWindow函数将指定窗口带到前台,并给予它输入焦点。用户能够看到该窗口位于最前面
- 参数:hWnd: 目标窗口的句柄
- 返回值: 返回true表示消息已成功投递,false表示失败
6.ShowWindow函数
[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
- 功能: ShowWindow函数用于设置窗口的显示状态,例如最小化、最大化、隐藏或显示窗口
- 参数:hWnd: 目标窗口的句柄。nCmdShow: 指定如何显示窗口的整数值,例如:1: 正常显示窗口。2: 最小化窗口。3: 最大化窗口
- 返回值: 返回true表示窗口状态更改成功,false表示失败
7.SetWindowPos函数
[DllImport("user32.dll", SetLastError = true)]private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
- 功能: SetWindowPos函数用于设置窗口的位置和大小
- 参数: hWnd: 目标窗口的句柄。
hWndInsertAfter: 用于定义窗口的Z序(即窗口的前后顺序),例如:
IntPtr.Zero:窗口放在Z序的顶部。
new IntPtr(-1):窗口放在Z序的底部。
X 和 Y: 窗口的新位置(左上角的坐标)。
cx 和 cy: 窗口的新宽度和高度。
uFlags: 一些标志,用于控制窗口位置和大小的设置方式。例如:
0x0001:忽略X和Y参数,只调整窗口大小。
0x0002:忽略cx和cy参数,只调整窗口位置。 - 返回值: 返回true表示成功,false表示失败
二、APP进程运行的方法
[DllImport("user32.dll", CharSet = CharSet.Auto)]public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);public static bool Run(string processPath, string processName, string arguments) //APP进程运行的方法{IntPtr hwdLogin = IntPtr.Zero;hwdLogin = FindWindow(null, processName);if (hwdLogin == 0) // 返回的数组长度为0,表示该进程不存在{try // 如果进程不存在,则启动它{ProcessStartInfo startInfo = new ProcessStartInfo{FileName = processPath,Arguments = arguments,UseShellExecute = false, // 使用 false 以便不使用系统外壳来启动进程};Process process = Process.Start(startInfo);return true;}catch (Exception ex){ return false;}}else{return true;}}
三、Windows消息 (Windows Messages)
Windows消息是用于在应用程序和操作系统之间传递信息的机制。每个消息都有一个唯一的整数值(通常表示为十六进制),这个值告诉操作系统或应用程序要执行什么操作。
1. 常见的Windows消息
-
WM_SETTEXT (0x000C):- 用途:设置窗口或控件的文本内容。
- 例如,用于设置文本框中的内容。
-
WM_COMMAND (0x0111):- 用途:用于通知窗口某个控件的事件(如按钮点击)。
- 例如,当一个按钮被点击时,会发送这个消息。
-
WM_CLOSE (0x0010):- 用途:请求关闭窗口。
- 例如,应用程序接收到这个消息时,会尝试关闭自己。
-
WM_PAINT (0x000F):- 用途:要求窗口重绘自己。
- 当窗口需要更新其显示内容时,系统会发送这个消息
四、代码使用实例
/*功能: FindWindow函数用于根据窗口的类名和窗口名称查找窗口的句柄(IntPtr类型)。这个句柄是一个唯一标识窗口的值,用于后续的窗口操作;
参数:lpClassName: 窗口类名,可以为null,表示忽略类名。lpWindowName: 窗口名称,也可以为null,表示忽略窗口名称
返回值: 返回找到的窗口句柄。如果没有找到,则返回IntPtr.Zero*/[DllImport("user32.dll", CharSet = CharSet.Auto)]public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);/*功能: GetDlgItem函数用于从指定的对话框或窗口中获取子窗口(通常是控件)的句柄参数:hWnd: 父窗口或对话框的句柄。nIDDlgItem: 子窗口的控件ID返回值: 返回子窗口的句柄。如果没有找到,则返回IntPtr.Zero*/[DllImport("user32.dll", CharSet = CharSet.Auto)]public static extern IntPtr GetDlgItem(IntPtr hWnd, int nIDDlgItem);/*功能: SendMessage函数用于向指定的窗口发送消息,并等待该消息被处理。它可以用来设置控件的文本、模拟用户输入等参数:hWnd: 目标窗口的句柄。Msg: 要发送的消息的类型。wParam: 消息的附加参数,通常用于传递小整数值。lParam: 消息的附加参数,这里使用字符串lParam来传递文本返回值: 返回消息的处理结果,具体值取决于发送的消息类型*/[DllImport("user32.dll", CharSet = CharSet.Auto)]public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, string lParam);/*功能: PostMessage函数也用于向指定窗口发送消息,但它不会等待消息处理完成。消息会被放入消息队列,处理由系统安排参数:hWnd: 目标窗口的句柄。Msg: 要发送的消息的类型。wParam 和 lParam: 附加参数,用于传递消息的数据返回值: 返回true表示消息已成功投递,false表示失败*/[DllImport("user32.dll", CharSet = CharSet.Auto)]public static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);/*功能: SetForegroundWindow函数将指定窗口带到前台,并给予它输入焦点。用户能够看到该窗口位于最前面。参数:hWnd: 目标窗口的句柄。返回值: 返回true表示成功,false表示失败*/[DllImport("user32.dll", SetLastError = true)]private static extern bool SetForegroundWindow(IntPtr hWnd);/* 功能: ShowWindow函数用于设置窗口的显示状态,例如最小化、最大化、隐藏或显示窗口。参数:hWnd: 目标窗口的句柄。nCmdShow: 指定如何显示窗口的整数值,例如:1: 正常显示窗口。2: 最小化窗口。3: 最大化窗口。返回值: 返回true表示窗口状态更改成功,false表示失败*/[DllImport("user32.dll")]private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);/* 功能: SetWindowPos函数用于设置窗口的位置和大小。参数: hWnd: 目标窗口的句柄。hWndInsertAfter: 用于定义窗口的Z序(即窗口的前后顺序),例如:IntPtr.Zero:窗口放在Z序的顶部。new IntPtr(-1):窗口放在Z序的底部。X 和 Y: 窗口的新位置(左上角的坐标)。cx 和 cy: 窗口的新宽度和高度。uFlags: 一些标志,用于控制窗口位置和大小的设置方式。例如:0x0001:忽略X和Y参数,只调整窗口大小。0x0002:忽略cx和cy参数,只调整窗口位置。返回值: 返回true表示成功,false表示失败*/[DllImport("user32.dll", SetLastError = true)]private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);public string ipport;private bool isRadmin调取中 = false;/* WM_SETTEXT: 常量0x000C,表示一个Windows消息,用于设置窗口或控件的文本内容。通常与SendMessage一起使用WM_COMMAND: 常量0x0111,表示一个命令消息,通常用于菜单项选择、按钮点击等操作*/private const uint WM_SETTEXT = 0x000C; // 用于设置文本消息private const uint WM_COMMAND = 0x0111; // 用于发送命令消息的消息public void OpenRadmin(){if (iPEndPoint!= null) //判断iPEndPoint是否为空{ipport = iPEndPoint.ToString(); //将其转换为ipport字符串var parts = ipport.Split(':'); //将ipport字符串拆分为两部分if (parts.Length == 2) //如果拆分结果是两个部分(即符合"IP:Port"格式){string ip = parts[0]; //将第一部分作为要打开窗口的IP地址string 监控窗口标题 = $"{ip} - 完全控制"; //$"{ip} - 完全控制"是Radmin Viewer中使用的窗口标题格式string 参数 = $"/connect:{ip}:{4899}/fullstretch/encrypt"; ///connect:{ip}:{4899}/fullstretch/encrypt"是传递给Radmin的命令行参数,指定要连接的IP和端口,以及其他选项IntPtr radminWindow = FindWindow(null, 监控窗口标题); //FindWindow函数查找是否有需要打开的监控窗口,如果没有则返回值为空if (radminWindow != IntPtr.Zero) //如果不为空{ ShowWindow(radminWindow, 1); // Radmin 窗口已存在,将窗口从最小化或后台状态恢复到前台SetForegroundWindow(radminWindow); //将其设置为当前的活动窗口int left = 2200; // 窗口左边距int top = 15; // 窗口上边距int width = 800; // 窗口宽度int height = 600; // 窗口高度SetWindowPos(radminWindow, IntPtr.Zero, left, top, width, height, 0); //调整窗口的位置和大小,以确保窗口在屏幕上的正确位置显示return;}if (isRadmin调取中 == false) //判断Radmin是否启动{ Cls外部进程.Run("C:\\Program Files (x86)\\Radmin Viewer 3\\Radmin.exe", 监控窗口标题, 参数); // 启动 Radmin Viewer 程序,并传递 IP 和连接参数isRadmin调取中 = true;} string 登录窗口标题 = "Radmin 安全性: " + ip; // 设置窗口标题,用于查找 Radmin Viewer 的安全性登录窗口IntPtr hwdLogin = WaitForWindow(登录窗口标题, 4000); // 等待 Radmin 登录窗口出现,最长等待 4 秒if (hwdLogin == IntPtr.Zero) //如果返回值为空,则没找到这个登录窗口{Console.WriteLine("未找到指定的窗口.");}else{ IntPtr hwdUser = GetDlgItem(hwdLogin, 0x7FF); // 查找用户名输入框控件句柄,0x7FF 可能是用户名输入框的ID,而 0x800 是密码输入框的IDIntPtr hwdPass = GetDlgItem(hwdLogin, 0x800); // 查找密码输入框的控件句柄string user = "THGK";string password = "000000";// 发送用户名和密码到输入框SendMessage(hwdUser, WM_SETTEXT, IntPtr.Zero, user);SendMessage(hwdPass, WM_SETTEXT, IntPtr.Zero, password);// 模拟点击登录按钮PostMessage(hwdLogin, WM_COMMAND, (IntPtr)0x78, IntPtr.Zero);}isRadmin调取中 = false;}else{throw new ArgumentException("ipport 参数格式不正确,应包含 IP 和端口,格式为 'IP:Port'");}}}private IntPtr WaitForWindow(string windowTitle, int timeout) //这个方法用于在指定的超时时间内,轮询查找某个窗口是否存在{IntPtr hwdLogin = IntPtr.Zero;int elapsed = 0;int interval = 100; // 检查间隔时间为 100 毫秒while (elapsed < timeout){hwdLogin = FindWindow(null, windowTitle); //通过FindWindow函数查找具有指定标题(windowTitle)的窗口if (hwdLogin != IntPtr.Zero){return hwdLogin; // 找到窗口,返回句柄}Thread.Sleep(interval); //轮询间隔为100毫秒,如果在该间隔内没有找到窗口,就休眠100毫秒elapsed += interval; //时间累计}return IntPtr.Zero; // 超过超时时间未找到窗口}相关文章:
WPF学习(8) --Windows API函数的使用
一、API函数的介绍 1.FindWindow函数 [DllImport("user32.dll", CharSet CharSet.Auto)]public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 功能: FindWindow函数用于根据窗口的类名和窗口名称查找窗口的句柄(IntPtr…...
Linux系统-用户账号文件
文章目录 文件一(passwd) 文件二(shadow) 加密密码部分 举例理解 文件三(gshadow) 文件四(group) 文件五(skel) 文件六(login.defs&#…...
docker配置国内镜像加速
docker配置国内镜像加速 由于国内使用docker拉取镜像时,会经常出现连接超时的网络问题,所以配置Docker 加速来使用国内 的镜像加速服务,以提高拉取 Docker 镜像的速度。 1、备份docker配置文件 cp /etc/docker/daemon.json /etc/docker/da…...
C语言实现排序之堆排序算法
一、堆排序算法 基本思想 堆排序是一种比较有效的排序方法,其基本思想是: 构建最大堆:首先将待排序的数组构建成一个最大堆,即对于每个非叶子节点,它的值都大于或等于其子节点的值。排序:然后将堆顶元素…...
【STM32 Blue Pill编程】-外部中断配置及使用
外部中断配置及使用 文章目录 外部中断配置及使用1、中断介绍2、STM32中的中断3、硬件准备及接线4、GPIO配置5、代码实现在本文中,我们将介绍如何使用 STM32Cube IDE 中的 HAL 库配置和处理外部中断。 我们将通过一个带有按钮和 LED 的示例来演示这一点。 读完本文后,您将能够…...
MySQL 安装与配置教程:单机、主从复制与集群模式
目录 MySQL 简介MySQL 安装MySQL 基础配置MySQL 主从复制配置MySQL 集群配置总结 1. MySQL 简介 MySQL 是一个广泛使用的关系型数据库管理系统,具有高性能、高可靠性和易用性等特点。它支持多种部署模式,包括单机模式、主从复制模式(用于高…...
JavaEE 的相关知识点(一)
一、过滤器 过滤器(Filter)是一个用于对请求和响应进行预处理的组件。过滤器可以在 Java Servlet 规范中使用,通常用于执行一些通用的任务 1、过滤器的作用 过滤器是一种javaEE规范中定义的一种技术,可以让请求达到目标servlet之…...
使用Python实现深度学习模型:智能医疗影像识别与诊断
介绍 智能医疗影像识别与诊断是现代医疗技术的重要应用,通过深度学习模型,可以自动分析和识别医疗影像,提高诊断的准确性和效率。本文将介绍如何使用Python和深度学习技术来实现智能医疗影像识别与诊断。 环境准备 首先,我们需要安装一些必要的Python库: pip install …...
24.给定一个链表,实现一个算法交换每两个相邻节点并返回其头部。要求不能修改列表节点中的值,只能更改节点本身。
24. Swap Nodes in Pairs 题目 给定一个链表,交换每两个相邻节点并返回其头部。要求不能修改列表节点中的值,只能更改节点本身。 Example: Given 1->2->3->4, you should return the list as 2->1->4->3....
Python 通过UDP传输超过64k的信息
Python 通过UDP传输超过64k的信息 在网络编程中,UDP(用户数据报协议)是一种常用的传输协议。与TCP不同,UDP是无连接的,并且不保证数据包的顺序、完整性及交付。尽管如此,UDP因其较低的延迟和开销而被广泛应…...
微服务设计原则——高性能:批量
能批量就不要并发。 如果调用方需要调用我们接口多次才能进行一个完整的操作,那么这个接口设计就可能有问题。 比如获取数据的接口,如果仅仅提供getData(int id)接口,那么使用方如果要一次性获取 20 个数据,它就需要循环遍历调用…...
C:指针学习-指针变量—学习笔记
今日伊雷娜: 目录 前言: 1、字符指针变量 1.1 使用字符指针存放字符 1.2 使用字符指针变量存放字符串 2、数组指针变量 2.1 什么是数组指针变量? 2.2 数组指针变量初始化 2.3 关于数组指针类型的解析 3、函数指针变量 3.1 函数地址 …...
【MySQL 07】表的增删查改 (带思维导图)
文章目录 🌈 一、insert 添加数据⭐ 1. 单行数据 全列插入⭐ 2. 多行数据 指定列插入⭐ 3. 插入否则更新⭐4. 插入否则替换 🌈 二、select 查询数据⭐ 1. select 列🌙 1.1 全列查询🌙 1.2 指定列查询🌙 1.3 查询字段…...
快速上手Git
Git相关概念 Git是一个开源的分布式版本控制系统,由Linus Torvalds在2005年创建,用于有效、高速地处理从小到大的项目版本管理。它是由 Linux 之父 Linus Torvalds 开发的,并已经成为了现代软件开发领域中最流行的版本控制系统之一。 git的工…...
RTC时钟测试
1. 基础知识 Linux 的系统时间有时跟硬件时间是不同步的。 Linux时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称RTC)时钟。系统时钟是指当前Linux Kernel中的时钟,而硬件时钟则是主板上由电池供电的时钟,这个硬件时钟可以在BIO…...
大数据技术——实战项目:广告数仓(第六部分)报表数据导出至clickhouse
目录 第11章 报表数据导出 11.1 Clickhouse安装 11.2 Clickhouse建表 11.2.1 创建database 11.2.2 创建table 11.3 Hive数据导出至Clickhouse 第11章 报表数据导出 由于本项目最终要出的报表,要求具备交互功能,以及进行自助分析的能力,…...
Android studio模拟制作-简易的订餐交易小案例
一、最终呈现效果 订餐支付小案例效果 二、布局设计activity_main.xml <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.com/apk/res/android"xml…...
消防隐患在线小程序的设计
管理员账户功能包括:系统首页,个人中心,用户管理,消防隐患举报管理,消防隐患分类管理,统计分类管理,处理结果管理,系统管理 微信端账号功能包括:系统首页,我…...
【Vue3】路由Params传参
【Vue3】路由Params传参 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗的日…...
授权cleanmymac访问全部磁盘 Mac授权访问权限 cleanmymac缺少权限
CleanMyMac是Mac系统下的一款专业的苹果电脑清理软件,同时也是一款优秀的电脑系统管理软件。它能有效清理系统垃圾,快速释放磁盘内存,缓解卡顿现象,保障系统顺畅地运行。 全磁盘访问权限,就好比机场内进行的安全检查。…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
