win32 API窗口句柄的获得——我的经验

原创 2002年11月10日 10:51:00

初次写文档,文笔不通畅的地方,以及理解错误之处望各位朋友多多指正!

这篇文章是关于如何获取窗口句柄,以及有哪些函数可供使用的简单讨论!可适用于vc、bcb(其他的我没有试,估计可以),本人在bcb环境下试验。

首先我会罗列出一些获取句柄的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,可以扫描桌面所有窗口并对之处理!

我的理解:(这部分用任务驱动式教学方法——谁让小弟是老师呢!xi xi)

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

解决办法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和循环结构也应该可以

总结:其实得到HWND的方法很多,比如知道了窗口层次,依次向下扫。。。在说第三种呢!但我觉得,我的方法最直接有效,你说呢?

欢迎大家与我联系,并讨论这个问题!有关这个问题我还有许多疑问,比如HWND与ID的转换,在如IE页面中的表单控件的HWND或ID,还是其他的东东,总之是能识别他的东西。。。这个我很困惑,没办法!

不清楚地方,大家要参照MSDN啊!(好东西呀!)

我的QQ:21445102,联络我啊!

易语言API时钟的使用方法

点击阅读原文子程序:.版本 2 .子程序 _时钟销毁, 逻辑型, 公开, 销毁一个时钟;成功返回真,失败返回假; .参数 窗口句柄, 整数型, , 直接用“取窗口句柄()”命令取出本窗口句柄即可 ....
  • Exiaoyin
  • Exiaoyin
  • 2016年06月25日 14:46
  • 1522

API 查找窗体句柄、发送消息

//一个引用 using System.Runtime.InteropServices; //一些定义,放在例如public partial class Form1 : Form下 ...
  • oceanark
  • oceanark
  • 2016年07月13日 22:43
  • 854

win32 获取窗口句柄的方法

win32 获取窗口句柄的方法   第一种方法是根据窗口句柄值获取窗口句柄 使用spy++获取指定窗口的窗口句柄值,因为句柄值是16进制数,所以前面加0x,然后进行强制转换为HWND类型。 ...
  • yuanmeng567
  • yuanmeng567
  • 2013年12月25日 12:37
  • 2086

如何获取控制台窗口句柄 (HWND)

摘要 详细信息 示例代码 属性 提供反馈 概要 它将会有助于处理与控制台应用程序关联的窗口。Win32 API 没有直接的方法用于获...
  • coredoor
  • coredoor
  • 2013年02月03日 22:45
  • 3639

Windows下获得窗口实例句柄的3种方法

1、使用全局变量保存窗口的实例句柄:在winmian函数中会有窗口的实例句柄,我们只需要将该实例句柄保存起来,就可以使用了; 2、在调用CreateWindow函数时,会存放该窗口的实例句柄;因此在...
  • xbk123123
  • xbk123123
  • 2017年12月01日 13:37
  • 235

得到窗口句柄的几种方法

最近一直在做MFC的项目,界面想要做的出色,窗口一定要操作熟练,那就得依靠窗口的句柄了。 转载了一下得到窗口句柄的几种方法: AfxGetMainWnd AfxGetMainWnd获取自身窗口句...
  • jigetage
  • jigetage
  • 2016年06月04日 01:05
  • 4086

如何得到句柄、窗口句柄

句柄 这一概念是MFC里的一个类,MFC有专门的函数来获取窗口句柄。 HWND hwnd; hwnd=CreateWindow("my own windowshandle","jaycnvip",WS...
  • phenixyf
  • phenixyf
  • 2012年08月22日 18:07
  • 2369

如何获得窗口句柄以及WIN32+API参考大全

在Windows程序设计领域处于发展初期时,Windows程序员可使用的编程工具唯有API函数。这些函数在程序员手中犹如"积木块"一样,可搭建出各种界面丰富、功能灵活的应用程序。不过,由于这些函数结构...
  • chenweitang123
  • chenweitang123
  • 2009年12月03日 01:30
  • 17278

windows下获得DC句柄的几个方法

1.SDK WIN32 API函数在view类中获得DC句柄 HDC hdc hdc=::GetDC(m_hWnd); ::ReleaseDC(m_hWnd,hdc) //一定要释放句柄 2.利用M...
  • jiangqin115
  • jiangqin115
  • 2015年03月10日 13:32
  • 1817

windows获取控制台窗口的句柄

全局声明: typedef HWND (WINAPI *PROCGETCONSOLEWINDOW)(); PROCGETCONSOLEWINDOW GetConsoleWindow; Main(...
  • yss28
  • yss28
  • 2016年11月02日 12:27
  • 1263
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:win32 API窗口句柄的获得——我的经验
举报原因:
原因补充:

(最多只允许输入30个字)