VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 1429|回复: 16

[原创] VC++智能枚举QQ聊天窗口类

[复制链接]
51_avatar_middle
online_admins Syc 发表于 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是否满足要求,接下来判断窗口的类名称是否满足要求,之后判断窗口的标题是否满足要求 等。相关的细节大家自己看源代码吧,我就不做过多的讲解了。

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

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


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




上一篇:C++对话框类型的动态识别
下一篇:MFC与QT实战开发汽车销售管理系统项目教程

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

92_avatar_middle
在线会员 a灬魂淡 发表于 2017-10-17 09:46:37 | 显示全部楼层
看看   学习了

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

06_avatar_middle
在线会员 angeltony 发表于 2017-10-17 11:05:26 | 显示全部楼层
看看,学习学习

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

83_avatar_middle
online_vip Cool丶 发表于 2017-10-18 12:05:28 | 显示全部楼层
看看再说吧

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

75_avatar_middle
online_vip xjianguo80 发表于 2017-10-19 11:27:38 | 显示全部楼层
好东西,学习学习

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

43_avatar_middle
在线会员 姊︽兂纭呰胺 发表于 2017-10-19 12:16:23 | 显示全部楼层
RE: VC++智能枚举QQ聊天窗口类 [修改]

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

92_avatar_middle
在线会员 sdxiao 发表于 2017-10-20 05:38:14 | 显示全部楼层
RE: VC++智能枚举QQ聊天窗口类 [修改]

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

54_avatar_middle
在线会员 dzyong 发表于 2017-10-20 15:51:23 | 显示全部楼层
好的分享,多谢楼主~~~~

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

21_avatar_middle
在线会员 dlstar 发表于 2017-10-20 15:55:38 | 显示全部楼层
来受教了……VC++智能枚举QQ聊天窗口类

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

65_avatar_middle
在线会员 ping170 发表于 2017-10-23 09:44:32 | 显示全部楼层
学习了,O(∩_∩)O谢谢楼主

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

32_avatar_middle
online_vip commonye 发表于 2017-10-23 16:40:25 | 显示全部楼层
这个不错哦

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

71_avatar_middle
在线会员 silvanEvil 发表于 2017-11-1 16:51:47 | 显示全部楼层
看看   学习了

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

97_avatar_middle
在线会员 Atom 发表于 2017-12-14 17:18:44 | 显示全部楼层
学习了,慢慢看才可以看懂的

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

20_avatar_middle
在线会员 old_brother 发表于 2018-4-2 15:14:19 | 显示全部楼层
学习了,楼主ZZ

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

74_avatar_middle
在线会员 jlsjls 发表于 2018-4-3 16:41:21 | 显示全部楼层
感谢分享

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

53_avatar_middle
online_vip zsqzsq123123 发表于 2018-10-21 09:52:02 | 显示全部楼层
谢谢,学习下

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

38_avatar_middle
在线会员 VCxuexi2013 发表于 2018-10-23 11:00:07 | 显示全部楼层
学习下,正需要

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

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

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

GMT+8, 2018-11-19 22:35

Powered by Discuz! X3.4

© 2009-2018 cctry.com

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