windows使用FindWindow函数查找窗口句柄

news2024/11/29 1:45:33

理解什么是句柄?

对于“句柄”,之前一直停留在一知半解的认识层面,也说不清具体概念,只知道它是一个标识符,用来标记对象或者说某个东西的。只知其名不知其意。目前学习windows编程,对“句柄”做一个完整的认。

现在先看一张图(这张图是从其他博主博文扒下来的):
在这里插入图片描述
在这里插入图片描述
图1是程序运行到某时刻时的内存快照,图2是程序往后运行到另一时刻时的内存快照。红色部分标出了两次的变化。

【解释一下:】
windows是一个以虚拟内存为基础的操作系统,很多时候,进程的代码和数据并不是全部装入内存,进程某一段装入内存之后,可能会被换出到外存。当再次需要时会重新装入内存。两次装入内存,那么很多时候装入的地址是不一样的。也就是说同一个对象在内存中的地址会变化。那么程序怎么才能准确的访问到对象呢?这时候就引入了句柄。

系统为每个进程在内存中分配一定的区域,用来存放各个句柄,即一个个32位无符号整型值(32位操作系统中)。每个32位无符号整型值相当于一个指针,指向内存中的另一个区域(我们不妨称之为区域A)。而区域A中存放的正是对象在内存中的地址。当对象在内存中的位置发生变化时,区域A的值被更新,变为当前时刻对象在内存中的地址,而在这个过程中,区域A的位置以及对应句柄的值是不发生变化的。这种机制,用一种形象的说法可以表述为:有一个固定的地址(句柄),指向一个固定的位置(区域A),而区域A中的值可以动态地变化,它时刻记录着当前时刻对象在内存中的地址。这样,无论对象的位置在内存中如何变化,只要我们掌握了句柄的值,就可以找到区域A,进而找到该对象。而句柄的值在程序本次运行期间是绝对不变的,我们(即系统)当然可以掌握它。这就是以不变应万变,按图索骥,顺藤摸瓜。

所以,我们可以这样理解句柄:
  • 数值上:是一个32位的unsigned int;
  • 逻辑上:相当于一个二级指针。指向对象在内存中的地址。(理解上:这个指针的值不可变的,普通指针的值可以变得。)
  • 作用上:是windwos使用句柄来标识诸多资源或者对象。比如窗口,画笔,进程,线程等等。

【回到开头,windows下我们如何拿到一个窗口句柄】:
使用FindWindow函数可以根据窗口的类名和窗口名拿到句柄

HWND FindWindow(LPCTSTR IpClassName,LPCTSTR IpWindowName);
//IpClassName :指向一个指定了类名的空结束字符串
//pWindowName:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为空,则为所有窗口全匹配。
//返回值:如果函数成功,返回值为具有指定类名和窗口名的窗口句柄;如果函数失败,返回值为NULL。

[那么我们如何获取到窗口的 类名 和 窗口名呢?]
我们可以使用vs自带的工具spy++.exe;
通过搜索–>查找窗口,拖到要查询的窗口就行。
在这里插入图片描述
现在,我们写一个简单的例子:用记事本打开一个文件。我这里打开的是cfg.ini文件。然后找到记事本窗口,然后通过查找到的记事本窗口句柄将记事本窗口进行移动位置并且改变大小。

//根据类名和窗口名查找窗口句柄
HWND GetWindowHandle(std::string className, std::string windowName)
{
	HWND hwnd = FindWindowA(className.c_str(), windowName.c_str());
	return hwnd;
}

int main()
{
	HWND notePadWHND = GetWindowHandle("Notepad", "cfg.ini - 记事本");
	if (notePadWHND) {
		RECT rect;
		GetWindowRect(notePadWHND, &rect); //获取记事本窗口的位置
		MoveWindow(notePadWHND, rect.left + 500, rect.top + 300, 300, 300, TRUE);//移动记事本窗口
	}
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GPT与人类共生:解析AI助手的兴起

随着GPT模型的崭新应用,如百度的​1​和CSDN的​2​,以及AI助手的普及,人们开始讨论AI对就业市场和互联网公司的潜在影响。本文将探讨GPT和AI助手的共生关系,以及我们如何使用它们,以及使用的平台和动机。 GPT和AI助手…

【AI视野·今日Robot 机器人论文速览 第六十一期】Tue, 24 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Tue, 24 Oct 2023 Totally 50 papers 👉上期速览✈更多精彩请移步主页 Daily Robotics Papers Robot Fine-Tuning Made Easy: Pre-Training Rewards and Policies for Autonomous Real-World Reinforcement Learning Autho…

常用编程语言排行与应用场景汇总(2023.10)

文章目录 编程语言排行一、Python二、C三、C四、Java五、C#六、JavaScript七、VB(Visual Basic)八、PHP九、SQL十、ASM(Assembly Language)十一、Go十二、Scratch十三、Delphi/Object Pascal十四、MATLAB十五、Swift十六、Fortran…

十九、类型信息(5)

动态代理 _代理_是基本的设计模式之一。一个对象封装真实对象,代替其提供其他或不同的操作—这些操作通常涉及到与“真实”对象的通信,因此代理通常充当中间对象。这是一个简单的示例,显示代理的结构: interface Interface {voi…

【Java 进阶篇】Java Web开发:实现验证码功能

在Web应用程序中,验证码(CAPTCHA)是一种常见的安全工具,用于验证用户是否为人类而不是机器。验证码通常以图像形式呈现,要求用户在登录或注册时输入正确的字符。在这篇文章中,我们将详细介绍如何在Java Web…

NEFU离散数学实验特别篇1-树和图

树相关概念 离散数学中,树是一种重要的数据结构,它是一种无向连通图,并且不存在环。下面是树的相关概念和公式: 1. 顶点数为n的树,边数为n-1。 2. 度数为k的树中有k个分支。 3. 一棵树中最多只有两个度数大于1的顶点&a…

京东API获得JD商品详情 item_get-获得JD商品详情

item_get-获得JD商品详情 公共参数 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)获取key和secret接入secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_sear…

面经(面试经验)第一步,从自我介绍开始说起

看到一位同学讲自己的面试步骤和过程,我心有所感,故此想整理下面试的准备工作。以便大家能顺利应对面试,通过面试... 求职应聘找工作,面试是必然的关卡,如今竞争激烈呀,想要得到自己喜欢的工作&#xff0c…

U盘装系统Win10步骤和详细教程

如果我们遇到系统问题,导致无法正常使用系统了,这时候就可以考虑给电脑重新安装系统。有用户想用U盘来进行系统的重装,但不清楚具体重装步骤,下面小编给大家详细介绍关于U盘重装系统Win10的详细步骤方法,帮助大家简单轻…

请求转发和重定向的区别

目录 一、请求转发 二、重定向 一、请求转发 request.getRequestDispatcher(页面).forwad(request,response) 请求转发: 客户端(浏览器)向服务器的资源 A 发起一次请求 ①。服务器的资源 A 接收到该请求后,将该请求转发到内部的…

FedAT:异步更新联邦学习方法

文章链接:FedAT: A Communication-Efficient Federated Learning Method with Asynchronous Tiers under Non-IID Data 发表会议: SC’21 (International Conference for High Performance Computing, Networking, Storage, and Analysis) 高性能计算,体…

高能有料 | 第二届OpenHarmony技术大会议程速递

第二届开放原子开源基金会OpenHarmony技术大会如约而至 让我们一起 开封无限惊喜的技术成果 开放无限前沿的议题干货 开启无限可能的未来之门 点击此处报名参会!

接口自动化测试设计!

一、接口测试基础 1.什么是接口测试? 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。接口测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖…

01【保姆级】-GO语言特点 下载安装 hello

01-GO语言基本概念和安装使用 一、概念1.1 Go语言的诞生1.2 GO语言的特点: 二、安装go2.1 安装2.2 安装环境变量 三、下载&安装goland3.1 官网下载3.2 下载后,进行安装: 四、Go语言的特性(重点)4.1 第一个hello wo…

Spire.doc读取模板文档,并在书签处插入内容

在书签位置插入文字 //加载模板文档 Document document new Document(Server.MapPath("~/File/评价结果.doc")); //创建书签导航器 BookmarksNavigator bn new BookmarksNavigator(document); //添加一个section到文档 Section newSec document.AddSection(); …

Redis Sentinel 哨兵模式

Sentinel 哨兵模式 Redis Sentinel 官网 Redis 的 Sentinel 文档 -- Redis中国用户组(CRUG) Sentinel Redis 命令参考(红色) Sentinel 通过监控的方式获取主机的工作状态是否正常,当主机发生故障时, Senti…

生产制造业如何进行进销存管理?建议收藏!

进销存是什么?生产制造业如何进行进销存管理?制造进销存都能为企业提供什么?进销存管理系统的优势?本文将带大家深入浅出的聊聊制造进销存,全面剖析制造进销存的前世今生,并且为大家提供2023年十大制造进销…

「linux基础」上传代码到github/gitee

一、在gitee创建一个仓库 1.创建仓库 2.获取仓库地址 二、克隆仓库文件到linux中 1.查看Linux中是否安装git:git --version 如果没有,在root下使用指令 yum install -y git 安装。 2.使用 git clone 仓库地址,克隆仓库文件到linux中 三、第…

第一章 02Java入门-常环境变量的意义

前言 上次我们学习了常见的CMD命令,这次我们做一个用它做一个练习打开QQ(CMD方式打开),最后引出环境变量的意义。 一、CMD打开qq 可以看到,如果直接在CMD里面打开QQ,是不可以的,因为QQ的路径不在默认路径C盘,而在D盘下面的develop文件夹下面的qq下面的qq.exe下(自己…

软考高级之系统架构师之计算专题

操作系统 需要一定操作系统基础知识才能计算的题目。 吞吐率 某指令流水线由5段组成,各段所需要的时间如下图所示。连续输入100条指令时的吞吐率为()。 解析: 指令流水线的吞吐率定义为: 吞吐率 T P 指令数 执行时…