获得Win32窗口句柄的更好的方法

“VC6中使用CHtmlView在对话框控制中显示HTML文件”

“如何禁用HTML页面的上下文菜单”

“Convert CHtmlView to CHtmlCtrl...”

这三篇文章的原文实际上都出自 MSDN Magazine 及其前身 MSJ 的“C++ Q&A”专栏作家 Paul DiLascia 之手。此君从1995年开始就成为 MS 在 C++/MFC 方面的高级写手,Paul 在 Windows 应用开发领域的造诣颇深。直到现在仍然在为该专栏撰写技术文章,只不过其文章已不仅仅涉及 C++/MFC,偶尔也写一些 C#。为了微软的 .NET 战略,Paul 可谓忠实、勤奋和敬业......

本文是以上文章所涉及内容的延伸。如果你已经对前述文章讨论的东西了然于心,那么可以直接切入本文的正题。如果你没有看过上面提到的文章,建议最好先看一下,以便了解本文内容的背景,这样对于理解本文所讨论的东西会更有帮助。

背景简介

话说在第六期的“VC6中使用CHtmlView在对话框控制中显示HTML文件”一文中,主要讨论并示范了如何改进 MFC 的 CHtmlView 类,使它能处理基于对话框的应用和各种其它类型的窗口应用,其思路是通过创建 CHtmlView 的派生类 CHtmlCtrl,使得 CHtmlView 摆脱了对文档/视图的依赖。

在第十一期的“如何禁用HTML页面的上下文菜单”一文中,主要讨论了如何通过子类化 IE 服务器窗口(Internet Explorer_Server)来禁用 CHtmlCtrl 的上下文菜单。实际上,真正显示HTML的窗口并不是浏览器(CHtmlView/CHtmlCtrl)窗口,而是一个名为“Internet Explorer_Server”的最底层的子孙窗口。这一点可以通过 Spy++ 来证实,为了获得该窗口的句柄(HWND),在实现过程中使用了一个函数 GetLastChild(HWND hwndParent),其定义如下:

static HWND GetLastChild(HWND hwndParent)
{
  HWND hwnd = hwndParent;
  while (TRUE) {
   HWND hwndChild = ::GetWindow(hwnd, GW_CHILD);
   if (hwndChild==NULL)
     return hwnd;
   hwnd = hwndChild;
  }
  return NULL;
}

通过这个函数返回某个父窗口下的最后一个子窗口,也就是说返回子窗口的子窗口的子窗口......直到不再有子窗口为止。可惜这个函数要获得正确的运行结果是有前提的,那就是窗口层次只能是一层,并且最终的窗口后裔是“Internet Explorer_Server”窗口。 在通常情况下,这个假设都成立。不幸的是,如果 HTML 文档中包含象 ComBoxes(组合框) 这样的控制时,这个假设就不灵了。用 Spy++ 不难发现情况并不象你期望的那样─Internet Explorer_Server是最后的子窗口。实际上,在IE中,Edit 和 Button 控制并非人们所想象的那样是子窗口。

获得 Win32 窗口句柄的更好的方法

为了解决这个问题,本文设计了一个更加完善的类:CFindWnd,用更好的算法专门来获取 IE 窗口。CFindWnd 查找某个窗口(给定窗口名字)的第一个子窗口。 例如,它的使用方法如下:

CFindWnd ies(m_hWnd, "Internet Explorer_Server");
myHwndIE = ies.m_hWnd;

这个类的构造函数调用函数:

FindChildClassHwnd(hwndParent, (LPARAM)this)

函数,该函数又调用:

EnumChildWindows 和 FindWindowEx  

搜索所有后裔窗口直到找到类名匹配窗口为止。FindWindow 用来查找最顶层窗口,而搜索子窗口还得用 FindWindowEx,它是 Win32 API 函数。CFindWnd 返回第一个匹配的窗口,所以它只被用于查找你期望只有一个实例的窗口。通常在搜索特定窗口时,一般最保险的做法都是检查窗口类名。

时间: 2024-11-08 22:21:17

获得Win32窗口句柄的更好的方法的相关文章

一种实现Win32消息处理处理函数的新方法 - 基于Thunk实现的类成员消息处理函数

Windows是一个消息驱动的操作系统,在系统中发生的所有消息均需要通过消息处理过程(或叫窗口过程)进行处理.由于C++给我们在程序设计中带来更多的灵活性(如继承.重载.多态等),所以我们都希望能够使用C++的类来封装Windows中的窗口过程函数,但是Windows规定了窗口过程函数必须定义为一个全局函数,也就是说需要使用面向过程的方法来实现,为了使用面向对象的技术来实现消息处理,我们必须另辟它径.目前我们在网络上见得比较多的方式是使用Thunk将即将传递给窗口过程的第一个参数(HWND hW

微软试图让Win32开发者能够更轻松地得到桌面桥(Desktop Bridge)

微软正在采取方法让更多的Win32和.NET开发者能够将他们的应用程序带到Windows 10应用程序商店之中. 微软试图让Win32开发者能够更轻松地得到桌面桥 在9月14日,微软宣布它将在Windows应用商店中推出Desktop App Converter(代码代号为"Project Centennial")供直接下载.微软计划通过应用程序商店为Desktop App Converter推出新功能和补丁. 微软正在与Flexera Software就InstallShield进行

DB2提供一种更好的方法实现乐观锁定

在 IBM i 6.1 版本,DB2 为用户提供一项新功能(ROW CHANGE列)可以为需要使用乐观锁的应用程序改进其算法.乐观锁定是一种基于网络数据库应用程序中广泛应用的技术,这些应用程序一定会读取数据但是只是有可能更新读取过的数据,但其不会维持一个与数据库的持久连接.因为应用并不维持一个持久的连接,用户不能够依靠行级锁为那些后续更新的行保持数据完整性.实现乐观锁定的一个常见方法是,把这个应用程序可能稍后要更新的那一行对应的列的所有值记录在缓存中,再将这些值在接下来的更新语句作为条件. SE

实现ASP.NET 2.0无刷新页面更方便的方法

"无刷新页面",只是一种不确切的效果描述(其实还有其他各种方法来实现这个效果),更确切的说法是:在页面上用JavaScript调用服务器端的一个方法,然后处理返回的数据.实现它最标准的方法当然是XMLHTTP.但是,程序员都是懒惰的家伙,每个人都希望能有更方便的方法,或者,更佳的包装.比如,Lostinet的Rane就是对XMLHTTP的一个很好的包装. 终于,在ASP.NET 2.0里面,我们可以轻松的来做到这点了.服务器端任何实现了System.Web.UI.ICallbackEv

新手提问大神,java源代码写好后该怎么用,打包成exe?还是有别的更好的方法

问题描述 新手提问大神,java源代码写好后该怎么用,打包成exe?还是有别的更好的方法 有开发经验的大神告诉我,java源代码写好后该怎么用,打包成exe?还是有别的更好的方法,有的提到了脚本之类的 解决方案 点进去看看,试着去用用http://jingyan.baidu.com/article/358570f6727bb7ce4724fc88.html 解决方案二: 点进去看看,试着去用用http://jingyan.baidu.com/article/358570f6727bb7ce472

c++-请大神帮忙看看二维数组这样定义和删除正确吗,顺便问问还有其他更好的方法吗

问题描述 请大神帮忙看看二维数组这样定义和删除正确吗,顺便问问还有其他更好的方法吗 如图如图如图如图如图如图如图如图如图如图如图如图如图如图如图如图如图如图如图如图如图如图如图如图如图如图如图如图如图如图 解决方案 这么写没问题,但是如果你第二维的每一行长度相同,你其实可以用一维数组代替,比如 cin >> row >> col; char * ptable = new char[col * row]; ptable[i * col + j] = 'a'; // 相当于 ptabl

php中json_encode UTF-8中文乱码的更好解决方法_php技巧

最近在接口代码当中用到过json_encode,在网上找到说json_encode编码设置为UTF-8中文就不会乱码,经验证这办法确实是有效果的,但是不知道为什么,代码在用过一段时间之后就不太管用了.以下是自己的解决json_encode的办法.有更好的方法请分享出来吧! 第一种: 这种简单的做一个代码转换,urlcode之后再返回所需数组 我代码这样就足够了. 代码如下 复制代码 public static function encodeOperations ($array) { foreac

.net 多次调用字典查询结果table 有比使用全局变量更好的方法吗

问题描述 .net 多次调用字典查询结果table 有比使用全局变量更好的方法吗 .net 多次调用字典查询结果table 有比使用全局变量更好的方法吗

追逐搜索引擎的算法太累 做好SEO有更好的方法

现在太多做SEO的人希望能破译搜索引擎的算法用在自己的网站上,从而获取良好的排名,我看到有很多做SEO的人天天盯着搜索引擎的算法去做优化.搜索引擎一有风吹草动就赶紧弄明白搜索引擎哪项算法作出调整了.其实这么做就像猫抓老鼠一样,很累,而且太不现实.据谷歌的官方说法是:谷歌一年对算法的调整不下500次.也就是说差不多一天都会进行一次半的调整,开发搜索引擎的人多聪明,人家整团队有多少人.我们怎么可能准确的抓住搜索引擎的算法呢,我们需要透过现象看本质,抓住一些本质的东西,尽量的把握一些不可按的东西.才能