区别 FindWindow,FindWindowEx,EnumWindows,EnumChildWindows

1. FindWindow()

HWND FindWindow(LPCSTR lpClassName, LPCSTR lpWindowName);

功能:查找与指定窗口类名和窗口名称相匹配的顶级窗口,这个函数不搜索子窗口。

参数:如果lpClassName为null,将会寻找任何与lpWindowName参数匹配的窗口,如果lpWindowName为NULL,则匹配所有窗口名。

返回值:成功返回窗口句柄。否则返回NULL。

2.FindWindowEx()

HWND

WINAPI

FindWindowExW(

_In_opt_ HWND hWndParent,

_In_opt_ HWND hWndChildAfter,

_In_opt_ LPCWSTR lpszClass,

_In_opt_ LPCWSTR lpszWindow);

功能:

在窗口列表中寻找与指定条件相符的第一个子窗口 。

该函数获得一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。

这个函数查找子窗口,从排在给定的子窗口后面的下一个子窗口开始。在查找时不区分大小写。

参数:

(1)hwndParent:要查找的子窗口所在的父窗口的句柄

如果设置了hwndParent,则表示从这个hwndParent指向的父窗口中搜索子窗口。

如果hwndParent为 0 ,则函数以桌面窗口为父窗口,查找桌面窗口的所有子窗口。

如果hwndParent是HWND_MESSAGE,函数仅查找所有消息窗口。

(2)hwndChildAfter :子窗口句柄。查找从在Z序中的下一个子窗口开始。子窗口必须为hwndParent窗口的直接子窗口而非后代窗口。

如果HwndChildAfter为NULL,查找从hwndParent的第一个子窗口开始。

如果hwndParent 和 hwndChildAfter同时为NULL,则函数查找所有的顶层窗口及消息窗口。

(3)lpszClass:指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。

(4)lpszWindow:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为 NULL,则为所有窗口全匹配。

返回值:

如果函数成功,返回值为具有指定类名和窗口名的窗口句柄。如果函数失败,返回值为NULL。

3. EnumWindows()

BOOL EnumWindows(WNDENUMPROC lpEnumFunc,LPARAM lParam)

功能:

该函数枚举所有屏幕上的顶层窗口,并将窗口句柄传送给应用程序定义的回调函数。

回调函数返回FALSE将停止枚举,否则EnumWindows函数继续到所有顶层窗口枚举完为止。

参数:

lpEnumFunc:指向一个应用程序定义的回调函数指针

lPararm:指定一个传递给回调函数的应用程序定义值

返回值:

如果函数成功,返回值为非零;如果函数失败,返回值为零。

回调函数原型:

BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam);

hwnd:顶层窗口的句柄

lparam:应用程序定义的一个值(即EnumWindows中lParam)

4 EnumChildindows()

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

功能:

枚举一个父窗口的所有子窗口。

如果回调函数返回true,则枚举继续直到枚举完成;如果返回false,则将会中止枚举。

参数:

hWndParent: 父窗口句柄

lpEnumFunc: 回调函数的地址

lParam:          自定义的参数

返回值:

如果函数成功,返回值为非零;如果函数失败,返回值为零。

回调函数原型:

BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam);

hwnd:顶层窗口的句柄

lparam:应用程序定义的一个值(即EnumWindows中lParam)

异同点:

1. FindWindow 查找顶级窗口,不搜索子窗口。而FindWindowEx则是查找一个窗口的子窗口。

相同点:都是只查找一次,找到返回窗口句柄,找不到返回NULL。 都可与while构成循环。

2. EnumWindows 枚举屏幕上的所有顶层窗口; 而EnumChildWindows 则枚举一个父窗口的所有子窗口。

相同点,都是通过回调函数实现,回调函数会阻塞直到枚举完成,或者枚举中止。

3. FindWindow(NULL, NULL) 的While循环 与 EnumWindows() 相同;

4. FindWindowEx(.., NULL, .., ..) 的While循环 与 EnumChildWindows() 相同;

例如:

void Find()
{
    HWND hwnd = NULL;
    HWND AfterHwnd = NULL;  

    while(true)
    {
        hwnd = ::FindWindowEx(NULL, AfterHwnd, _T("#32770"), NULL);  

        if(!hwnd)
        {
            break;
        }
        else
        {
            TCHAR szTitle[MAX_PATH] = {0};
            ::GetWindowText(hwnd, szTitle, MAX_PATH))  

            if(wcsstr(strTitle, _T("Test")) != 0)
            {
		//...相关代码
            }
        } 

        AfterHwnd = hwnd;
    }
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-16 21:25:08

区别 FindWindow,FindWindowEx,EnumWindows,EnumChildWindows的相关文章

英文不好也能快速"记忆" API

英文不好不要紧,把API函数导入打字练习类软件,即是练习打字速度,提高编程效率:也能短时间记忆API. 坚持每天打一遍,约2小时,连续打两周,会对API有很好的记忆,此方法是结合英文学习方法!以下是Window API函数例表,大家可以试试效果特别好! AbnormalTermination AbortDoc AbortPath AbortPrinter AbortProc AbortSystemShutdown AccessNtmsLibraryDoor ActivateKeyboardLay

DLL中获取主程序句柄

一.问题由来及说明 在实际编程中遇到一些系统模块(或API)调用初始化需要窗口句柄,在主程序中(MFC或者win32)都可以很容易获得,比如mfc中可以直接调用AfxGetMainWnd().GetSafeHwnd()获取窗口句柄.但是如果跨DLL调用就很难拿到主程序的窗口句柄,那么如何获取呢? 二.可用的方法介绍 1. FindWindow/FindWindowEx函数 如果知道主调程序的进程名称,可以用FindWindow枚举并查找系统运行的所有窗口函数. 该函数之所以可以运行,是因为win

windows平台UI自动化测试

原文地址:http://www.51testing.com/html/16/n-170116.html 以前写过一篇跟UI自动化 测 试有关的技术,谈到了一个自动化测试工具必备的几个功能,而且也提到了Windows平台自动化测试工具所基于的一些技术.下边就说 一下这些技术的比较和展望,同时也包含了一些纠结-- Windows API 识 别窗口:需要通过FindWindow和EnumWindows来查找到窗口句柄,然后再调用其它 API(GetWindowText,GetWindowRect,

Windows挂钩注入DLL

注入DLL实现源码:HINSTANCE g_hInstDll = NULL; HHOOK g_hHook = NULL; DWORD g_dwThreadId = 0; #ifdef _MANAGED #pragma managed(push, off) #endif BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call)

FindWindow和FindWindowEx

函数原型:FindWindow(lpszClassName,lpszWindowName) 参数:lpszClassName--窗口类名;lpszWindowName--窗口标题 功能:查找窗口,未找到则返回NULL SDK中 HWND hwnd = FindWindow(NULL, "计算器"); if(m_pWnd) { AfxMessageBox("找到了!"); ::PostMessage(hwnd,WM_CLOSE,0,0);//强迫退出 } MFC中 C

WinAPI: FindWindow、FindWindowEx - 查找窗口

FindWindow(   lpClassName,        {窗口的类名}   lpWindowName: PChar {窗口的标题} ): HWND;              {返回窗口的句柄; 失败返回 0} //FindWindowEx 比 FindWindow 多出两个句柄参数: FindWindowEx(   Parent: HWND;    {要查找子窗口的父窗口句柄}   Child: HWND;      {子窗口句柄}   ClassName: PChar; {}  

FindWindow()&&FindWindowEx

这个函数呢,我一般用来自动刷刷网页啥的比如我最近就在刷52破解的在线时间,好啦怎么用是你自己的事情. FindWindow()主要用来获取目标句柄 或着说窗口的权限 HWND FindWindow(   LPCTSTR lpClassName,   LPCTSTR lpWindowName ); 调用://示例52破解挂在线时间 HWND 52pj; 52pj=::FindWindow( NULL,"地址组合控制"); HWND FindWindowEx(          HWND 

vb代码之------FindWindow and FindWindowEx控制其他程序

应该有不少童鞋都喜欢用自己的程序来控制其他程序吧,但是又恨自己技术浅,那么今天给大家带来一个简单的vb控制器 在此之前,我想说一下句柄 对于Win32程序员来说,如果不知道句柄,那么也太逊了吧,那句柄是什么呢?百度百科是这样说的 "个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值,来标识应用程序中的不同对象和同类中的不同的实例" 首先,你可以知道句柄是一个整数,这个不难理解吧,还有是用来标识应用程序的实例,也就是一个整数标识了一个应用程序.在操作系统中,每

句柄和指针的区别和联系

所谓 句柄实际上是一个数据,是一个Long (整长型)的数据.句 柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等.WINDOWS句柄有点象C语言中的文件句柄. 从上面的定义中的我们可以看到,句柄是一个标识符,是拿来标识对象或者项目的,它就象我们的姓名一样,每个人都会有一个,不同的人的姓名不一样,但是,也可能有一个名字和你一样的人.从数据类型上来看它只是一个16位的无符号整数.应用程序几乎总是