枚举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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值