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

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; // 超过超时时间未找到窗口}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SSM环保知识普及平台—计算机毕业设计源码20330
  • JavaScript AI 编程助手
  • 回顾 | 瑞云科技亮相ICIC2024,虚拟仿真实训云平台引关注
  • 下载文件--后端返回文件数据,前端怎么下载呢
  • 论文阅读笔记:The Graph Neural Network Model
  • 微信小程序电话号码授权
  • 机器学习第十一章-特征选择与稀疏学习
  • Vue3.0生命周期钩子(包含:Vue 2.0 和 Vue 3.0)
  • JavaEE 的相关知识点(一)
  • [000-002-01].数据库调优相关学习
  • python提取b站视频的音频(提供源码
  • 华为---端口隔离简介和示例配置
  • 牛客周赛 Round 56
  • 索引——appinventor
  • Spring Boot 实现定时任务
  • ES6指北【2】—— 箭头函数
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 【React系列】如何构建React应用程序
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • canvas 高仿 Apple Watch 表盘
  • CSS相对定位
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Facebook AccountKit 接入的坑点
  • js正则,这点儿就够用了
  • passportjs 源码分析
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • tensorflow学习笔记3——MNIST应用篇
  • underscore源码剖析之整体架构
  • vue脚手架vue-cli
  • 前端工程化(Gulp、Webpack)-webpack
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 数据结构java版之冒泡排序及优化
  • 译有关态射的一切
  • 在Mac OS X上安装 Ruby运行环境
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ‌JavaScript 数据类型转换
  • # linux 中使用 visudo 命令,怎么保存退出?
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #LLM入门|Prompt#3.3_存储_Memory
  • (007)XHTML文档之标题——h1~h6
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (vue)页面文件上传获取:action地址
  • (补充)IDEA项目结构
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (计算机网络)物理层
  • (每日一问)操作系统:常见的 Linux 指令详解
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (转)Linux整合apache和tomcat构建Web服务器
  • ***监测系统的构建(chkrootkit )
  • **PHP二维数组遍历时同时赋值
  • . Flume面试题