WIN32 API获取窗口句柄

WIN32 API获取窗口句柄WIN32API获取窗口句柄2008-08-1305:28P.M. 关于如何获取窗口句柄,以及有哪些函数可供使用的简单讨论!首先罗列出一些获取句柄的win32api函数,然后简单说说他们的用途!最后说说是怎么理解和应用的。可用的win32api函数: 1.HWNDFindWindow(LPCTSTRlpClassName,L

大家好,又见面了,我是你们的朋友全栈君。

WIN32 API获取窗口句柄

2008-08-13 05:28 P.M.

 

关于如何获取窗口句柄,以及有哪些函数可供使用的简单讨论!

首先罗列出一些获取句柄的win32 api 函数,然后简单说说他们的用途!最后说说是怎么理解和应用的。

可用的win32 api函数:

 

1.HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName)

    HWND FindWindowEx(HWND hwndParent, HWND hwndChildAfter,LPCTSTR lpClassName, LPCTSTR lpWindowName)

2.HWND WindowFromPoint(POINT& Point)

3.BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)

   BOOL CALLBACK EnumChildWindows(HWND hWndParent, WNDENUMPROC lpEnumFunc,LPARAM lParam)

   BOOL CALLBACK EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)

   BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)

 

一般用途:

        对于第一种,大家都很熟悉,是捕捉句柄的常规武器,FindWindow这两兄弟,可以接受捕捉对象的类名或者窗口标题之一,作为参数,返回一个 HWND。可是对于一般群众,不一定知道所有的窗口(包括标题栏、按钮等等)的类名啊!——可以简单举例,请问你知道桌面图标的窗口的类名吗?而对于窗口 标题,有可能会出现相同的标题,有两个窗口——指一个程序的两个进程,这又是个麻烦吧!好了,这个问题先放放,继续下一组。

       第二组,通过win32定义的POINT结构(typedef struct tagPOINT {   LONG x;

LONG y;} POINT),来获得当前鼠标光标位置的窗口HWND,这是最直观的武器!常规操作如下:先得到Cursor的POINT(BOOL GetCursorPos(LPPOINT)函数),再用WindowFromPoint。这样,我们几乎可以获得任何打开的有窗口的函数的HWND了! 然后通过获取类名的win32 api函数(int GetClassName( HWND hWnd,   LPTSTR lpClassName,   int nMaxCount ))得到类名——这里的lpClassName最好用字符数组地址,nMaxCount就是数组的size了,同时,这种方法解决了第一个问题的麻烦!——我可以把鼠标放在任何地方!*^_^*

       第三组,这些是用来列举和处理任何窗口的超级武器!通过组合运用EnumWindows和EnumWindowsProc,EnumChildWindows与EnumChildProc,可以扫描桌面所有窗口并对之处理!

我的理解

 

任务:得到所有的窗口的类名。

解决办法1:我们会先想到第三组,可以自桌面窗口开始(它是所有窗口的祖先),依次扫描,获取类名并存之。有点儿像Visual Stdio的Spy++,或者Borland 的WinSight32,具体办法如下:(bcb中)

在主程序中,调用EnumWindows,传入 YouEnumProc的函数地址作第一个参数,别忘了转换成WNDENUMPROC类型。第二参可 NULL。::EnumWindows(reinterpret_cast<WNDENUMPROC> YouEnumProc,NULL);

在YouEnumProc函数中,如果第一参HWND = = NULL,就跳离(return FALSE;),可以结束啦!

然后,把类名数组准备好,得到类名,存之。

返回真值,继续下一次扫描。

看起来并不复杂,是一种函数递归。但是我可会解释!面啊!: p

第二种解决方法:简单、直观——自己想出来的,颇得意

首先准备一个时钟,一种存类名方法(我用TMemo)

在定时器处理函数中:

1、得到当前cursor的点位置

2、再用WindowFromPoint,

3、然后得到类名,放到TMemo里

第三种方法:其实利用FindWindow和循环结构也应该可以。

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/162556.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【测试岗】快来抄模板,3W字41个软件测试超常见实例问题(附带答案)

    码字太难了,这些问题保存在我的word文档中,但是CSDN有特殊的模板格式,结果还是一行行粘贴过来的大家看着这份文章上,多给点关注收藏呀~~~~~~另外需要更多的面试题可以点击并输入暗号:CSDN目录1.给你一个字符串,你怎么判断是不是ip地址?手写这段代码,并写出测试用例2.请进行测试用例设计:一串数字,闰年的判别3.请你说一说简单用户界面登陆过程都需要做哪些分析4.请对这个系统做出测试用例:一个系统,多个摄像头,抓拍车牌,识别车牌,上传网上,网上展示5.请你对吃鸡游戏进行压力测试6.请你根据微

    2022年4月8日
    47
  • vue长列表渲染_vue 二维数组渲染

    vue长列表渲染_vue 二维数组渲染循环在模板中可以用v-for指令来循环数组,对象等。循环数组我们可以用v-for指令基于一个数组来渲染一个列表。v-for指令需要使用iteminitems形式的特殊语法,其中it

    2022年7月30日
    8
  • 关于IntelliJ Idea搭建javaweb项目出现的Error filterStart错误解决

    关于IntelliJ Idea搭建javaweb项目出现的Error filterStart错误解决随着java行业的快速发展,我们用的开发工具也从eclipse转到了IntelliJIdea,我相信很多朋友在用idea的时候都出过各种问题,今天我要说的这个问题,也是我耗费了一天时间才找到问题的缘由。          因为公司需要,我用idea搭建了一个Struts2+mybatis+spring的项目,因为之前没怎么用过idea,所以搭建的时候遇到了很多问题。在pom文件里把需要的

    2022年7月11日
    50
  • 海思Hi3798MV100机顶盒芯片介绍[通俗易懂]

    海思Hi3798MV100机顶盒芯片介绍[通俗易懂]Hi3798MV100是海思推出的专门针对OTT机顶盒市场的高性价比芯片方案。在码流兼容性、在线视频播放的流畅性、图像质量以及整机性能方面保持业界最好的用户体验。集成四核高性能处理器、内置NEON,其处理性能可以满足各种差异化的业务需求,支持Dolby和DTS音频处理。支持H.265、H.264、AVS+、MVC、MPEG2、MPEG4、VC-1、VP6、VP8等多种格式的高清视频解码和高性…

    2022年6月15日
    88
  • 批处理for命令的用法_批处理主要解决

    批处理for命令的用法_批处理主要解决1.前言for是批处理中最复杂,也最强大的关键字。熟练掌握for的用法,才可能理解批处理的强大之处。2.基本用法2.1.概念for是对一组文件中的每一个文件执行某个特定命令。FOR%variableIN(set)DOcommand[command-parameters]%variable,指定一个单一字母可替换的参数。(set),指定一个或一组文…

    2022年8月31日
    4
  • Java分布式锁

    Java分布式锁Java分布式锁我的理解应该叫集群锁或者跨实例锁锁的作用是在多线程情况下,控制线程同步访问变量,执行代码块、方法,例如synchronized,在单个jvm进程中,这样是奏效的。但是在分布式环境中,单个服务往往都是要部署多台实例的,在有多个jvm进程的集群里,synchronized就达不到我们的要求了。synchronized只能控制当前jvm进程中的线程,对于其它jvm进程中的线程,它无能为力。也就是说有可能一个jvm中的线程是同步执行的,在此过程中,或许会有集群里其它jvm的线程执行到

    2022年6月10日
    46

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号