win32 API窗口句柄的获得

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 YouEnumProc,NULL);

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

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

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

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

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

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

在定时器处理函数中:

1、得到当前cursor的点位置

2、再用WindowFromPoint,

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

这样可以用鼠标获得你想要的窗口(包括按钮等),只要鼠标在窗口放一会儿。。。哈哈

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

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

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

不清楚地方,大家要参照MSDN啊!(好东西呀!) 下面是来自微软的例子,这个枚举所有的窗口,然后向窗口发送关闭的消息。

#include BOOL CALLBACK EnumWindowsProc( HWND hwnd, DWORD lParam ); // // EnumWindowsProc must be called from a Windows

// application on Windows 95. // int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // // Close all open applications. // EnumWindows(EnumWindowsProc, 0); // Now do a regular logoff. ExitWindowsEx(EWX_LOGOFF , 0); } BOOL CALLBACK EnumWindowsProc( HWND hwnd, DWORD lParam )

{ DWORD pid = 0; LRESULT lResult; HANDLE hProcess; DWORD dwResult; lResult = SendMessageTimeout( hwnd, WM_QUERYENDSESSION, 0, ENDSESSION_LOGOFF, SMTO_ABORTIFHUNG, 2000, &dwResult); if( lResult ) { // // Application will terminate nicely, so let it. // lResult = SendMessageTimeout( hwnd, WM_ENDSESSION, TRUE,

ENDSESSION_LOGOFF, SMTO_ABORTIFHUNG, 2000, &dwResult); } else // You have to take more forceful measures. { // // Get the ProcessId for this window. // GetWindowThreadProcessId( hwnd, &pid ); // // Open the process with all access. // hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); // // Terminate the process. // TerminateProcess(hProcess, 0);

} // // Continue the enumeration. // return TRUE; }

>> 本文固定链接: https://www.vcgood.com/archives/472

>> 转载请注明: cboy 2006年02月10日 于 C语言帝国 发表

相关推荐

淘宝1是真的吗?淘宝一元购入口在哪里?
beat365唯一官网

淘宝1是真的吗?淘宝一元购入口在哪里?

📅 08-01 👁️ 4165
打扫卫生的机器人多少钱一个
365足球平台是合法的吗

打扫卫生的机器人多少钱一个

📅 07-21 👁️ 5766
我为什么那么爱你
亚洲365bet投注

我为什么那么爱你

📅 07-28 👁️ 8321
足浴半包套和全包套的区别
365足球平台是合法的吗

足浴半包套和全包套的区别

📅 07-10 👁️ 894
基本解释
365足球平台是合法的吗

基本解释

📅 07-18 👁️ 5100
psv的摇杆和psp的摇杆不一样,那使用寿命有多长??
凧的笔画顺序
365足球平台是合法的吗

凧的笔画顺序

📅 07-12 👁️ 4497
0375是哪里的电话区号,平顶山市的电话区号是多少
365足球平台是合法的吗

0375是哪里的电话区号,平顶山市的电话区号是多少

📅 07-04 👁️ 2449
一个普通的Java开发的换工作之旅
亚洲365bet投注

一个普通的Java开发的换工作之旅

📅 07-26 👁️ 1310