枚举Windows窗口

BOOL EnumWindows(
 WNDENUMPROC lpEnumFunc,  // callback function
    LPARAM lParam            // application-defined value
   );
执行EnumWindows时,User32.dll会把传递进来的lpEnumFunc和lParam记录下来,然后开始遍历所有顶层

窗口。每找到一个窗口,user32.dll就把这个窗口的句柄跟lParam传递给回调函数lpEnumFunc并执行它。

lpEnumFunc是自定义的一个函数,它明显体现了应用程序跟操作系统交互的现象。如果lpEnumFunc返回

true则user32.dll会继续遍历窗口,如果lpEnumFunc返回false则user32.dll停止遍历窗口,EnumWindows

的任务也就完成了(否则直到所有窗口被遍历完)。

lpEnumFunc的声明形式是这样的:
BOOL __stdcall EnumProc( HWND  hWnd, LPARAM parameter );
其中 LPARAM parameter 是通过EnumWindows 的LPARAM lParam 传进来的。
// 以下代码抄了网上的
BOOL __stdcall EveryWindowProc(HWND hWnd, LPARAM parameter )
{
 // 不可见、不可激活的窗口不作考虑。
 if ( !IsWindowVisible(hWnd) )
  return TRUE;

 if ( !IsWindowEnabled(hWnd) )
  return TRUE;

 // 弹出式窗口,但没有标题的不作考虑。
 LONG gwl_style = GetWindowLong( hWnd, GWL_STYLE );
 if ((gwl_style & WS_POPUP) && !(gwl_style & WS_CAPTION))
  return TRUE;
 // 父窗口是可见或可激活的窗口不作考虑。
 HWND hParent = (HWND)GetWindowLong( hWnd, GWL_HWNDPARENT );
 if ( IsWindowEnabled(hParent) )
  return TRUE;
 if ( IsWindowVisible(hParent) )
  return TRUE;

 // Shell_TrayWnd类的窗口(托盘里面的)不作考虑。
 TCHAR szClassName[MAX_PATH];
 GetClassName( hWnd, szClassName, MAX_PATH );
 if ( !wcscmp(szClassName, _T("Shell_TrayWnd")) )
  return TRUE;

 if ( nFlag == 0 )
 {
  // 最小化
  CloseWindow( hWnd );
 }
 else
 {
  // 激活并恢复原大小及位置
  OpenIcon( hWnd );
 }

 return TRUE;
}

我: 在查找Windows窗口中, 好多人通过窗口的标题来判断是否要找的窗口, 这是一种方法。还有一种方

法, 就是通过类名来查找(如果是你自己实现的程序), 看看修改:名的方法是怎样的:
1、新建一个基于对话框工程,工程名为test。
2、修改资源文件。
用记事本或其它文本编辑工具打test.rc,找到这样的一段,加入自定义类名
IDD_TEST_DIALOG DIALOGEX 0, 0, 320, 200
STYLE DS_MODALFRAME WS_POPUP WS_VISIBLE WS_CAPTION WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "test"
CLASS "BlackFox的对话框" // 在这加入类名
FONT 9, "宋体"
3、注册窗口类。
在BOOL CTestApp::InitInstance()中构造对话框之前加入以下代码:
WNDCLASS wndMyClass;
::GetClassInfo(AfxGetInstanceHandle(), "#32770", &wndMyClass);//取得原来对话框的窗口类属性
wndMyClass.lpszClassName = "BlackFox的对话框";//将类名改成自定义的类名
AfxRegisterClass(&wndMyClass); file://关键的一行,如果不注册,对话框就出不来了。
5、编译程序,用Spy++看看。搞定了。
我刚学VC不久,希望各位大虾批评指正!

 

 

http://blog.csdn.net/bluesky_03/archive/2008/04/22/2314978.aspx

如果您是在Windows操作系统下进行开发,可以使用以下方法来枚举所有窗口: 1. 使用EnumWindows函数来枚举所有顶级窗口。该函数的原型为: ```c++ BOOL EnumWindows( WNDENUMPROC lpEnumFunc, LPARAM lParam ); ``` 其中,lpEnumFunc是一个回调函数,用于处理枚举到的每个窗口,lParam是一个用户参数,可以传递给回调函数。 2. 在回调函数中,可以使用GetWindowText函数来获取窗口标题,使用GetClassName函数来获取窗口类名,使用IsWindowVisible函数来判断窗口是否可见。 3. 如果要获取子窗口,可以使用EnumChildWindows函数来枚举指定父窗口的所有子窗口。该函数的原型为: ```c++ BOOL EnumChildWindows( HWND hWndParent, WNDENUMPROC lpEnumFunc, LPARAM lParam ); ``` 其中,hWndParent是父窗口句柄,lpEnumFunc和lParam的含义与EnumWindows函数相同。 下面是一个示例代码,可以枚举所有顶级窗口,并输出每个窗口的标题和类名: ```c++ #include <Windows.h> #include <iostream> using namespace std; BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) { char title[256]; char className[256]; GetWindowText(hwnd, title, sizeof(title)); GetClassName(hwnd, className, sizeof(className)); if (IsWindowVisible(hwnd)) { cout << "Title: " << title << endl; cout << "Class: " << className << endl; cout << "-----------------------" << endl; } EnumChildWindows(hwnd, EnumWindowsProc, lParam); return TRUE; } int main() { EnumWindows(EnumWindowsProc, NULL); return 0; } ``` 该示例代码会输出所有可见窗口的标题和类名,包括子窗口。您可以根据需要进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值