枚举窗口及其应用
来源:互联网 发布:社会网络的同义词 编辑:程序博客网 时间:2024/06/05 15:58
一:利用GetWindow(ParentWnd, GW_CHILD);
- void FindAllChildWnd(HWND ParentWnd)
- {
- HWND hChild = ::GetWindow(ParentWnd, GW_CHILD);
- for(; hChild!=NULL ; hChild=::GetWindow(hChild,GW_HWNDNEXT))
- {
- TCHAR WindowText[30]={0};
- ::SendMessage(hChild,WM_GETTEXT,(WPARAM)(sizeof(WindowText)/sizeof(TCHAR)),(LPARAM)WindowText);
- TCHAR ClassName[30]={0};
- ::GetClassName(hChild,ClassName,sizeof(ClassName)/sizeof(TCHAR));
- trace2(WindowText,ClassName);
- FindAllChildWnd(hChild);
- }
- }
- void CDemoDlg::OnButton1()
- {
- FindAllChildWnd(::GetForegroundWindow());
- }
二:利用回调函数EnumChildProc枚举所有子窗口
- BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)
- {
- TCHAR WindowText[100]={0};
- ::SendMessage(hwnd,WM_GETTEXT,(WPARAM)(sizeof(WindowText)/sizeof(TCHAR)),(LPARAM)WindowText);
- TCHAR ClassName[100]={0};
- ::GetClassName(hwnd,ClassName,sizeof(ClassName)/sizeof(TCHAR));
- trace2(WindowText,ClassName);
- return TRUE ;
- }
- void CDemoDlg::OnButton2()
- {
- ::EnumChildWindows(::GetForegroundWindow(),EnumChildProc,NULL);
- }
三:利用回调函数EnumChildProc枚举所有可见的桌面窗口
- BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam)
- {
- if ( GetParent(hwnd)==NULL && IsWindowVisible(hwnd) )
- {
- TCHAR WindowText[100]={0};
- ::SendMessage(hwnd,WM_GETTEXT,(WPARAM)(sizeof(WindowText)/sizeof(TCHAR)),(LPARAM)WindowText);
- trace(WindowText);
- }
- return true;
- }
- void CDemoDlg::OnButton3()
- {
- EnumWindows(EnumWindowsProc ,(LPARAM)0 );
- }
四:利用FindWindowEx寻找指定类名或窗口标题的窗口句柄
- //简单的寻找子窗口句柄
- HWND hwnd=::FindWindowEx(m_hWnd,NULL,"#32770",NULL);
2.枚举窗口的应用
应用一:寻找指定类名的窗口句柄。
(1)单一函数的形式
- /****************************************************************************
- 寻找指定类名的窗口句柄 方法一
- ****************************************************************************/
- HWND FindWithClassName(HWND ParentWnd,TCHAR* FindClassName)
- {
- HWND hChild = ::GetWindow(ParentWnd, GW_CHILD);
- for(; hChild!=NULL ; hChild=::GetWindow(hChild,GW_HWNDNEXT))
- {
- TCHAR ClassName[100]={0};
- ::GetClassName(hChild,ClassName,sizeof(ClassName)/sizeof(TCHAR));
- if (_tcscmp(ClassName,FindClassName)==0)
- return hChild;
- HWND FindWnd=FindWithClassName(hChild,FindClassName);
- if (FindWnd)
- return FindWnd;
- }
- return NULL;
- }
- //调用
- void CDemoDlg::OnButton6()
- {
- HWND hWnd=FindWithClassName(::GetForegroundWindow(),"Edit");
- if (hWnd)
- {
- TCHAR WindowText[100]={0};
- ::SendMessage(hWnd,WM_GETTEXT,(WPARAM)(sizeof(WindowText)/sizeof(TCHAR)),(LPARAM)WindowText);
- trace(WindowText);
- }
- else
- {
- trace("can not find");
- }
- }
(2)类的形式
- /****************************************************************************
- 寻找指定类名的窗口句柄 方法二
- ****************************************************************************/
- class CFindWithClassName
- {
- public:
- static HWND FindWnd;
- static TCHAR ClassName[100];
- static BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)
- {
- ::GetClassName(hwnd,ClassName,sizeof(ClassName)/sizeof(TCHAR));
- if (_tcscmp(ClassName,(TCHAR*)lParam)==0)
- {
- FindWnd=hwnd;
- return false;
- }
- return TRUE ;
- }
- static HWND Find(HWND hwndParent, TCHAR* FindClassName)
- {
- ::EnumChildWindows(hwndParent,EnumChildProc,(LPARAM)FindClassName);
- return FindWnd;
- }
- };
- HWND CFindWithClassName::FindWnd=NULL;
- TCHAR CFindWithClassName::ClassName[100]=_T("");
- //调用
- void CDemoDlg::OnButton7()
- {
- HWND hWnd=CFindWithClassName::Find(::GetForegroundWindow(),_T("Edit"));
- if (hWnd)
- {
- TCHAR WindowText[100]={0};
- ::SendMessage(hWnd,WM_GETTEXT,(WPARAM)(sizeof(WindowText)/sizeof(TCHAR)),(LPARAM)WindowText);
- trace(WindowText);
- }
- else
- {
- trace("can not find");
- }
- }
(3)大师Paul DiLascia写的。
- ////////////////////////////////////////////////////////////////
- // MSDN Magazine -- August 2003
- // If this code works, it was written by Paul DiLascia.
- // If not, I don't know who wrote it.
- // Compiles with Visual Studio .NET on Windows XP. Tab size=3.
- //
- // ---
- // This class encapsulates the process of finding a window with a given class name
- // as a descendant of a given window. To use it, instantiate like so:
- //
- // CFindWnd fw(hwndParent,classname);
- //
- // fw.m_hWnd will be the HWND of the desired window, if found.
- //
- class CFindWnd {
- private:
- //////////////////
- // This private function is used with EnumChildWindows to find the child
- // with a given class name. Returns FALSE if found (to stop enumerating).
- //
- static BOOL CALLBACK FindChildClassHwnd(HWND hwndParent, LPARAM lParam) {
- CFindWnd *pfw = (CFindWnd*)lParam;
- HWND hwnd = FindWindowEx(hwndParent, NULL, pfw->m_classname, NULL);
- if (hwnd) {
- pfw->m_hWnd = hwnd; // found: save it
- return FALSE; // stop enumerating
- }
- EnumChildWindows(hwndParent, FindChildClassHwnd, lParam); // recurse
- return TRUE; // keep looking
- }
- public:
- LPCSTR m_classname; // class name to look for
- HWND m_hWnd; // HWND if found
- // ctor does the work--just instantiate and go
- CFindWnd(HWND hwndParent, LPCSTR classname)
- : m_hWnd(NULL), m_classname(classname)
- {
- FindChildClassHwnd(hwndParent, (LPARAM)this);
- }
- };
- void CDemoDlg::OnButton5()
- {
- CFindWnd fw(::GetForegroundWindow(),"Edit");
- TCHAR WindowText[30]={0};
- ::SendMessage(fw.m_hWnd,WM_GETTEXT,(WPARAM)(sizeof(WindowText)/sizeof(TCHAR)),(LPARAM)WindowText);
- trace(WindowText);
- }
应用二:寻找指定控件ID的窗口句柄。
子控件的ID使用spy++(VS2008版本) 查看获得
(1)方法一,类的形式
- class CFindWithID
- {
- public:
- static BOOL CALLBACK _EnumChildProc( HWND hwnd, LPARAM lParam )
- {
- //*(DWORD*)lParam 即是传进来的Control ID
- if ( GetDlgCtrlID(hwnd) == *(DWORD*)lParam )//判断是否为需要的控件
- {
- *(HWND*)lParam=hwnd; //强制转换
- return FALSE;
- }
- return TRUE;
- }
- static HWND Find(HWND TopWnd, DWORD ControlID )
- {
- EnumChildWindows( TopWnd , _EnumChildProc, (LPARAM)&ControlID );
- return ::IsWindow( (HWND)ControlID ) ? (HWND)ControlID : NULL;
- }
- };
- void CDemoDlg::OnButton8()
- {
- HWND hWnd=CFindWithID::Find(::GetForegroundWindow(),0x000003e9);
- if (hWnd)
- {
- TCHAR WindowText[100]={0};
- ::SendMessage(hWnd,WM_GETTEXT,(WPARAM)(sizeof(WindowText)/sizeof(TCHAR)),(LPARAM)WindowText);
- trace(WindowText);
- }
- else
- {
- trace("can not find");
- }
- }
(2)方法二:(单一函数的形式)
- HWND FindControlWnd(HWND ParentWnd,DWORD ControlID)
- {
- HWND hChild = ::GetWindow(ParentWnd, GW_CHILD);
- for(; hChild!=NULL ; hChild=::GetWindow(hChild,GW_HWNDNEXT))
- {
- //判断是否为需要的控件
- if ( GetDlgCtrlID(hChild) == ControlID )
- return hChild;
- HWND FindWnd=FindControlWnd(hChild,ControlID);
- if (FindWnd)
- return FindWnd;
- }
- return NULL;
- }
- void CDemoDlg::OnButton9()
- {
- HWND hWnd=FindControlWnd(::GetForegroundWindow(),0x000003e9);
- if (hWnd)
- {
- TCHAR WindowText[100]={0};
- ::SendMessage(hWnd,WM_GETTEXT,(WPARAM)(sizeof(WindowText)/sizeof(TCHAR)),(LPARAM)WindowText);
- trace(WindowText);
- }
- else
- {
- trace("can not find");
- }
- }
0 0
- 枚举窗口及其应用
- 枚举窗口及其应用
- 枚举的含义及其应用
- 枚举的含义及其应用
- 创建透明窗口及其应用--屏幕画笔
- 创建透明窗口及其应用--屏幕画笔
- 创建透明窗口及其应用--屏幕画笔
- 窗口枚举
- 枚举窗口
- 枚举窗口
- 枚举进程,枚举窗口
- 枚举应用
- 枚举应用
- 枚举应用
- 枚举应用
- JAVA枚举及其用法
- 枚举所有窗口
- 枚举浏览器窗口
- 大型网站的架构设计详解3
- 命令行mysqld启动不了数据库
- conda下载很慢怎么办?
- 广度优先遍历
- c++实验7-最大公约数和最小公倍数
- 枚举窗口及其应用
- 【新手】hibernate4配置自动建立数据库表时Unsuccessful
- 数据更新
- leetcode 7. Reverse Integer
- 【一天一道LeetCode】#82. Remove Duplicates from Sorted List II
- c++实验7——项目2:最大公约和和最小公倍数
- 求hession矩阵的特征值和特征向量
- [剑指Offer]二维数组中的查找
- ACM天梯赛练习L1-001. Hello World