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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • DOS 和 Linux 常用命令的对比

    DOS和Linux常用命令的对比许多在shell提示下键入的Linux命令都与你在DOS下键入的命令相似。事实上,某些命令完全相同。本附录提供了Windows的DOS提示

    2021年12月26日
  • eclipsesvn使用教程_eclipse导入svn项目

    eclipsesvn使用教程_eclipse导入svn项目做好以上的准备后打开Eclipse编译器,点击编译器右上角的OpenPerspective打开SVN资源库界面,新建一个资源库选择资源库的位置,这里我们就用刚才搭好的svn://localhost/ts作为工程目录,点击Finish后如果成功则会看到版本服务器中工程的树形结构了(可能需要用户密码验证)。在svn://localhost/ts根目录上点右键,选择“验出”(英

    2022年9月26日
  • 基于Rust-vmm实现Kubernetes运行时[通俗易懂]

    基于Rust-vmm实现Kubernetes运行时[通俗易懂]随着容器及K8s的广泛使用,越来越多的容器安全与隔离问题被暴露出来,如:容器逃逸、水平攻击、DDos攻击等严重威胁了办公和生产环境的安全与稳定,影响了业务的正常运行。安全容器技术孕育而生,产生了kata、gVisor、unikernel等多种安全容器方案。本文旨在介绍各种安全容器方案,分析各方案特点,结合腾讯在容器安全领域的实践,帮助读者选择适合自身特性的容器运行时。同时引入Rust-VMM项目,介绍Rust-VMM技术和生态,演示如何使用K8s调度和启用Rust-VMM安全容器运行时,展望以Rust语

    2022年9月14日
  • Java 字符串包含_实现字符串的复制

    Java 字符串包含_实现字符串的复制1问题描述给定一长字符串A和一短字符串B。请问,如何最快地判断出短字符串B中的所有字符是否都在长字符串A中?请编写一个判断函数实现此功能。为简单起见,假设输入的字符串只包含小写英文字母。下面举几个例子。(1)如果字符串A是”abcd”,字符串B是”bad”,答案是包含,因为字符串B中的字母都在字符串A中,或者说B是A的真子集。(2)如果字符串A是”abcd”,字符串B是”bce”,答案是…

    2022年10月9日
  • pip和conda安装与卸载tensorflow、pycharm中使用特定的conda虚拟环境「建议收藏」

    pip和conda安装与卸载tensorflow、pycharm中使用特定的conda虚拟环境「建议收藏」写吴恩达dp作业做的准备参考https://blog.csdn.net/ccgcccccc/article/details/89058445根据他的配置要求来配置文件pipinstalltensorflow==1.13.0rc2-ihttps://pypi.tuna.tsinghua.edu.cn/simple或者-ihttps://mirrors.aliyun.com/py…

    2022年6月22日
  • msfconsole模块_msfconsole下载

    msfconsole模块_msfconsole下载Msfconsole提供了一个一体化的集中控制台。通过msfconsole,你可以访问和使用所有的metasploit的插件,payload,利用模块,post模块等等。Msfconsole还有第三方程序的接口,比如nmap,sqlmap等,可以直接在msfconsole里面使用。在启动MSF终端之后,可以首先输入help命令列出MSF终端所支持的命令列表,包括核心命令集和后端数据库命令集。对于其中的大部分命令,你可以输入help[COMMAND],进一步查看该命令的使用帮助信息。一、Msfconso

    2022年9月6日

发表回复

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

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