当前位置: 首页 > 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; // 超过超时时间未找到窗口}

相关文章:

WPF学习(8) --Windows API函数的使用

一、API函数的介绍 1.FindWindow函数 [DllImport("user32.dll", CharSet CharSet.Auto)]public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 功能: FindWindow函数用于根据窗口的类名和窗口名称查找窗口的句柄&#xff08;IntPtr…...

Linux系统-用户账号文件

文章目录 文件一&#xff08;passwd&#xff09; 文件二&#xff08;shadow&#xff09; 加密密码部分 举例理解 文件三&#xff08;gshadow&#xff09; 文件四&#xff08;group&#xff09; 文件五&#xff08;skel&#xff09; 文件六&#xff08;login.defs&#…...

docker配置国内镜像加速

docker配置国内镜像加速 由于国内使用docker拉取镜像时&#xff0c;会经常出现连接超时的网络问题&#xff0c;所以配置Docker 加速来使用国内 的镜像加速服务&#xff0c;以提高拉取 Docker 镜像的速度。 1、备份docker配置文件 cp /etc/docker/daemon.json /etc/docker/da…...

C语言实现排序之堆排序算法

一、堆排序算法 基本思想 堆排序是一种比较有效的排序方法&#xff0c;其基本思想是&#xff1a; 构建最大堆&#xff1a;首先将待排序的数组构建成一个最大堆&#xff0c;即对于每个非叶子节点&#xff0c;它的值都大于或等于其子节点的值。排序&#xff1a;然后将堆顶元素…...

【STM32 Blue Pill编程】-外部中断配置及使用

外部中断配置及使用 文章目录 外部中断配置及使用1、中断介绍2、STM32中的中断3、硬件准备及接线4、GPIO配置5、代码实现在本文中,我们将介绍如何使用 STM32Cube IDE 中的 HAL 库配置和处理外部中断。 我们将通过一个带有按钮和 LED 的示例来演示这一点。 读完本文后,您将能够…...

MySQL 安装与配置教程:单机、主从复制与集群模式

目录 MySQL 简介MySQL 安装MySQL 基础配置MySQL 主从复制配置MySQL 集群配置总结 1. MySQL 简介 MySQL 是一个广泛使用的关系型数据库管理系统&#xff0c;具有高性能、高可靠性和易用性等特点。它支持多种部署模式&#xff0c;包括单机模式、主从复制模式&#xff08;用于高…...

JavaEE 的相关知识点(一)

一、过滤器 过滤器&#xff08;Filter&#xff09;是一个用于对请求和响应进行预处理的组件。过滤器可以在 Java Servlet 规范中使用&#xff0c;通常用于执行一些通用的任务 1、过滤器的作用 过滤器是一种javaEE规范中定义的一种技术&#xff0c;可以让请求达到目标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的信息 在网络编程中&#xff0c;UDP&#xff08;用户数据报协议&#xff09;是一种常用的传输协议。与TCP不同&#xff0c;UDP是无连接的&#xff0c;并且不保证数据包的顺序、完整性及交付。尽管如此&#xff0c;UDP因其较低的延迟和开销而被广泛应…...

微服务设计原则——高性能:批量

能批量就不要并发。 如果调用方需要调用我们接口多次才能进行一个完整的操作&#xff0c;那么这个接口设计就可能有问题。 比如获取数据的接口&#xff0c;如果仅仅提供getData(int id)接口&#xff0c;那么使用方如果要一次性获取 20 个数据&#xff0c;它就需要循环遍历调用…...

C:指针学习-指针变量—学习笔记

今日伊雷娜&#xff1a; 目录 前言&#xff1a; 1、字符指针变量 1.1 使用字符指针存放字符 1.2 使用字符指针变量存放字符串 2、数组指针变量 2.1 什么是数组指针变量&#xff1f; 2.2 数组指针变量初始化 2.3 关于数组指针类型的解析 3、函数指针变量 3.1 函数地址 …...

【MySQL 07】表的增删查改 (带思维导图)

文章目录 &#x1f308; 一、insert 添加数据⭐ 1. 单行数据 全列插入⭐ 2. 多行数据 指定列插入⭐ 3. 插入否则更新⭐4. 插入否则替换 &#x1f308; 二、select 查询数据⭐ 1. select 列&#x1f319; 1.1 全列查询&#x1f319; 1.2 指定列查询&#x1f319; 1.3 查询字段…...

快速上手Git

Git相关概念 Git是一个开源的分布式版本控制系统&#xff0c;由Linus Torvalds在2005年创建&#xff0c;用于有效、高速地处理从小到大的项目版本管理。它是由 Linux 之父 Linus Torvalds 开发的&#xff0c;并已经成为了现代软件开发领域中最流行的版本控制系统之一。 git的工…...

RTC时钟测试

1. 基础知识 Linux 的系统时间有时跟硬件时间是不同步的。 Linux时钟分为系统时钟(System Clock)和硬件(Real Time Clock&#xff0c;简称RTC)时钟。系统时钟是指当前Linux Kernel中的时钟&#xff0c;而硬件时钟则是主板上由电池供电的时钟&#xff0c;这个硬件时钟可以在BIO…...

大数据技术——实战项目:广告数仓(第六部分)报表数据导出至clickhouse

目录 第11章 报表数据导出 11.1 Clickhouse安装 11.2 Clickhouse建表 11.2.1 创建database 11.2.2 创建table 11.3 Hive数据导出至Clickhouse 第11章 报表数据导出 由于本项目最终要出的报表&#xff0c;要求具备交互功能&#xff0c;以及进行自助分析的能力&#xff0c;…...

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…...

消防隐患在线小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;消防隐患举报管理&#xff0c;消防隐患分类管理&#xff0c;统计分类管理&#xff0c;处理结果管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;我…...

【Vue3】路由Params传参

【Vue3】路由Params传参 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日…...

授权cleanmymac访问全部磁盘 Mac授权访问权限 cleanmymac缺少权限

CleanMyMac是Mac系统下的一款专业的苹果电脑清理软件&#xff0c;同时也是一款优秀的电脑系统管理软件。它能有效清理系统垃圾&#xff0c;快速释放磁盘内存&#xff0c;缓解卡顿现象&#xff0c;保障系统顺畅地运行。 全磁盘访问权限&#xff0c;就好比机场内进行的安全检查。…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...