VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1669|回复: 17

[交流] VC++智能枚举QQ聊天窗口类

[复制链接]
51_avatar_middle
online_admins 发表于 2017-10-17 00:31:56 | 显示全部楼层 |阅读模式
前几年写过一些关于枚举窗口的操作,无非是调用 FindWindow 或者 EnumWindow 来查找或者枚举窗口。当然这两个函数都挺好用,但是针对一些细节就得每次都自己处理了。
比如我想找的这个窗口的窗口标题是可变化的,比如QQ的聊天窗口,这会我跟这个人聊,一会我又跟那个人聊,每个QQ好友的昵称或者备注都不同,所以这时候要靠 FindWindow 来找的话,不太好找。因为他在查找窗口标题的时候都是完全匹配,不能部分匹配。
另外,比如我要对查找的窗口判断是否属于某个进程,也得自己操作,调用 GetWindowThreadProcessId 来获得某个窗口所属的进程ID,之后再做比对。所以这里面我将这些细节简单封装了一下,没有完全封装完,也算是给大家提供一个思路吧,大家如果有时间可以自己再继续完善。
方便大家使用,随手写的代码难免有疏漏之处,还请大家指正!

  1. class CEnumParam
  2. {
  3. public:
  4.         CEnumParam()
  5.         {
  6.                 bTitleExactMatch = TRUE;
  7.                 dwProcessID = 0;
  8.         };
  9.         ~CEnumParam(){};

  10. public:
  11.         CString strClassName;
  12.         CString strTitle;
  13.         BOOL bTitleExactMatch;
  14.         DWORD dwProcessID;
  15.         vector<HWND> arr_wnds;
  16. };
复制代码


这个 CEnumParam 类呢,算是个枚举的参数类。里面包含了几个成员:
CString strClassName; 表明要枚举的窗口的类名字;
CString strTitle; 表明要枚举的窗口的标题;
BOOL bTitleExactMatch; 表明要枚举的窗口的标题是否完全匹配,TRUE完全匹配,FALSE部分匹配;
DWORD dwProcessID; 表明要枚举的窗口所属的进程ID;
vector<HWND> arr_wnds; 枚举的结果放到该 vector 容器中。

再给大家把 EnumWindow API 枚举窗口所需要的枚举函数 EnumWindowsProc 写出来:
  1. BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
  2. {
  3.         CEnumParam *pEnumParam = (CEnumParam*)lParam;

  4.         CString strClassName, strTitleName;
  5.         GetClassName(hwnd, strClassName.GetBufferSetLength(MAX_PATH), MAX_PATH);
  6.         strClassName.ReleaseBuffer();

  7.         GetWindowText(hwnd, strTitleName.GetBufferSetLength(MAX_PATH), MAX_PATH);
  8.         strTitleName.ReleaseBuffer();

  9.         DWORD dwMainProcessID = 0, dwMainThreadID = 0;
  10.         dwMainThreadID = GetWindowThreadProcessId(hwnd, &dwMainProcessID);
  11.         if (pEnumParam->dwProcessID > 0 && pEnumParam->dwProcessID != dwMainProcessID)
  12.         {
  13.                 return TRUE;
  14.         }

  15.         if (strClassName.GetLength() > 0 && strClassName.CompareNoCase(pEnumParam->strClassName) != 0)
  16.         {
  17.                 return TRUE;
  18.         }

  19.         if (strTitleName.GetLength() > 0)
  20.         {
  21.                 if (pEnumParam->bTitleExactMatch && strTitleName.CompareNoCase(pEnumParam->strTitle) == 0 ||
  22.                         !pEnumParam->bTitleExactMatch && strTitleName.Find(pEnumParam->strTitle) >= 0)
  23.                 {
  24.                         pEnumParam->arr_wnds.push_back(hwnd);
  25.                         return TRUE;
  26.                 }
  27.         }

  28.         return TRUE;
  29. }
复制代码


EnumWindowsProc 会被多次调用,每当 EnumWindow 枚举到一个顶层窗口之后,就会调用 EnumWindowsProc,其中第一个参数 hwnd 就是当前枚举到的窗口句柄。
EnumWindowsProc 首先会得到当前枚举到的窗口的 类名称、标题 以及窗口所属的进程ID。之后根据参数传递进来的 CEnumParam 类型指针进行各个条件的判断,看看是否满足要求。
首先判断窗口的进程ID是否满足要求,接下来判断窗口的类名称是否满足要求,之后判断窗口的标题是否满足要求 等。相关的细节大家自己看源代码吧,我就不做过多的讲解了。

最后写一段简单的调用示例(代码回复后可见):

游客,如果您要查看本帖隐藏内容请回复


以上,希望对大家有帮助吧!




上一篇:VC编程助手正式版+【源码】
下一篇:谁能编译出来这个远控的bin
92_avatar_middle
在线会员 发表于 2017-10-17 09:46:37 | 显示全部楼层
看看   学习了
06_avatar_middle
在线会员 发表于 2017-10-17 11:05:26 | 显示全部楼层
看看,学习学习
83_avatar_middle
online_vip 发表于 2017-10-18 12:05:28 | 显示全部楼层
看看再说吧
75_avatar_middle
online_vip 发表于 2017-10-19 11:27:38 | 显示全部楼层
好东西,学习学习
43_avatar_middle
在线会员 发表于 2017-10-19 12:16:23 | 显示全部楼层
RE: VC++智能枚举QQ聊天窗口类 [修改]
92_avatar_middle
在线会员 发表于 2017-10-20 05:38:14 | 显示全部楼层
RE: VC++智能枚举QQ聊天窗口类 [修改]
54_avatar_middle
在线会员 发表于 2017-10-20 15:51:23 | 显示全部楼层
好的分享,多谢楼主~~~~
21_avatar_middle
在线会员 发表于 2017-10-20 15:55:38 | 显示全部楼层
来受教了……VC++智能枚举QQ聊天窗口类
65_avatar_middle
在线会员 发表于 2017-10-23 09:44:32 | 显示全部楼层
学习了,O(∩_∩)O谢谢楼主
32_avatar_middle
online_vip 发表于 2017-10-23 16:40:25 | 显示全部楼层
这个不错哦
71_avatar_middle
在线会员 发表于 2017-11-1 16:51:47 | 显示全部楼层
看看   学习了
97_avatar_middle
在线会员 发表于 2017-12-14 17:18:44 | 显示全部楼层
学习了,慢慢看才可以看懂的
20_avatar_middle
在线会员 发表于 2018-4-2 15:14:19 | 显示全部楼层
学习了,楼主ZZ
74_avatar_middle
在线会员 发表于 2018-4-3 16:41:21 | 显示全部楼层
感谢分享
53_avatar_middle
online_vip 发表于 2018-10-21 09:52:02 | 显示全部楼层
谢谢,学习下
38_avatar_middle
在线会员 发表于 2018-10-23 11:00:07 | 显示全部楼层
学习下,正需要
77_avatar_middle
在线会员 发表于 2018-12-17 22:22:04 | 显示全部楼层
very  good            
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-3-22 13:39

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表