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

这篇具有很好参考价值的文章主要介绍了windows使用FindWindow函数查找窗口句柄。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

理解什么是句柄?

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

现在先看一张图(这张图是从其他博主博文扒下来的):
windows使用FindWindow函数查找窗口句柄,windows,windows
windows使用FindWindow函数查找窗口句柄,windows,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;
通过搜索–>查找窗口,拖到要查询的窗口就行。
windows使用FindWindow函数查找窗口句柄,windows,windows
现在,我们写一个简单的例子:用记事本打开一个文件。我这里打开的是cfg.ini文件。然后找到记事本窗口,然后通过查找到的记事本窗口句柄将记事本窗口进行移动位置并且改变大小。文章来源地址https://www.toymoban.com/news/detail-737523.html

//根据类名和窗口名查找窗口句柄
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;
}

到了这里,关于windows使用FindWindow函数查找窗口句柄的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • pyspark 笔记:窗口函数window

    窗口函数相关的概念和基本规范可以见:pyspark笔记:over-CSDN博客   以  partitionBy  作为分组条件, orderBy  对  Window  分组内的数据进行排序 后面的示例如无特殊说明,都是使用这个窗口规范  用于给出从1开始到每个窗口分区的结果的连续行号   [观察上面的数据,发现同样

    2024年01月19日
    浏览(89)
  • MATLAB 之 图形对象及其句柄和图形窗口与坐标轴

    MATLAB 的图形系统是面向图形对象的。图形对象是 MATLAB 图形元素的集合,是用于显示图形和设计用户界面的基本要素。 在 MATLAB 中,每一个具体的图形都是若干个不同的图形对象组成的。所有的图形对象都按父对象和子对象的方式组成层次结构,其形式如下图所示。 在图形对

    2024年02月09日
    浏览(46)
  • MySQL窗口函数(MySQL Window Functions)

           MySQL从8.0开始支持窗口函数(Window Functions),因其经常被用在数据分析的场景,窗口函数也被称为分析函数(Analytic Functions)。 目录 一、窗口函数概念 二、基础语法 2.1 窗口的定义 2.2 命名窗口 三、专用窗口函数 3.1 row_number() 3.2 rank() 3.3 dense_rank() 3.4 percent_rank() 3.5

    2024年02月11日
    浏览(43)
  • 创建函数句柄

    参考信息来源:matlab官方解析 什么是函数句柄?  简言之:函数句柄是一种存储指向函数的关联关系的Matlab数据类型。 注:可以使用下述的语句来查看变量h是否为函数句柄,如下所示: 创建函数句柄 通过在函数名前添加@符号来为该函数创建句柄。如: 创建句柄并调用该函

    2024年02月12日
    浏览(39)
  • matlab 函数句柄详解

    MATLAB中的函数句柄是一个非常重要的概念,可以让我们更加灵活地使用函数,并且可以提高代码的可读性和可维护性。本文将介绍MATLAB中函数句柄的基本概念、使用方法以及一些应用场景。希望能够帮助读者更好地理解和应用函数句柄。 一、函数句柄的基本概念 在MATLAB中,

    2024年02月10日
    浏览(38)
  • MATLAB中的函数句柄 理解

    https://zhuanlan.zhihu.com/p/266263265 https://blog.csdn.net/kevinhg/article/details/8861774 函数句柄也是MATLAB中的一种常见的数据类型,它的地位类似于其它计算机语言里的函数对象(Javascript,Python),函数指针(C++),或者函数引用(Perl)。 它的作用是将一个函数封装成一个变量,使其能够像其它变量

    2024年02月03日
    浏览(31)
  • hive窗口分析函数使用详解系列二之分组排序窗口函数

    我们讨论面试中各大厂的SQL算法面试题,往往核心考点就在于窗口函数,所以掌握好了窗口函数,面对SQL算法面试往往事半功倍。 已更新第一类聚合函数类,点击这里阅读 hive窗口函数聚合函数类 本节介绍Hive聚合函数中的第二类聚合函数:分组排序窗口函数。 这些函数的用

    2024年04月13日
    浏览(36)
  • Windows 10 X64 内核对象句柄表解析

    fweWindows 很多API函数都会创建和使用句柄(传入参数),句柄代表一个内核对象的内存地址,每个进程都有一个句柄表,它保存着进程拥有的句柄,内核也有一个句柄表 PspCidTable,它保存着整个系统的句柄。 ExpLookupHandleTableEntry windows内核句柄表结构解析 句柄表结构 进程句柄表位

    2024年02月06日
    浏览(87)
  • 真正理解微软Windows程序运行机制——什么是句柄

    我是荔园微风,作为一名在IT界整整25年的老兵,今天说说Windows程序的运行机制。经常被问到MFC到底是一个什么技术,为了解释这个我之前还写过帖子,但是很多人还是不理解。其实这没什么,我在学生时代也被这个问题困绕过。而且那个时间学习资料没有那么丰富,网上也

    2024年02月04日
    浏览(39)
  • SQL窗口分析函数使用详解系列三之偏移量类窗口函数

    本文以HiveSQL语法进行代码演示。 对于其他数据库来说同样也适用,比如SparkSQL,FlinkSQL以及Mysql8,Oracle,SqlServer等传统的关系型数据库。 已更新第一类聚合函数类,点击这里阅读 ①SQL窗口函数系列一之聚合函数类 ②SQL窗口函数系列二之分组排序窗口函数 本节介绍Hive窗口分

    2024年04月26日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包