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

茁某地孕

茁某地孕

2016-01-29 11:55

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

获得 Win32 窗口句柄的更好的方法
----动态生成并显示 HTML 文档
  ----再谈禁用HTML的上下文菜单...

编译/NorthTibet

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/cyuyanjiaocheng/)

原文出处:MSDN Magazine C++ Q&A


下载源代码

 译者注:
在以前的VC知识库 Online Journal 上有三篇文章:

“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 返回第一个匹配的窗口,所以它只被用于查找你期望只有一个实例的窗口。通常在搜索特定窗口时,一般最保险的做法都是检查窗口类名。

百家争鸣
   有一个读者来信指出:根本没有必要使用子类IE窗口的方法来禁用上下
展开更多 50%)
分享

猜你喜欢

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

C语言教程 C语言函数
获得 Win32 窗口句柄的更好的方法

解说Win32的窗口子类化

C语言教程 C语言函数
解说Win32的窗口子类化

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Win32下的几种串口通信编程

编程语言 网络编程
Win32下的几种串口通信编程

不是有效Win32应用程序的解决方法

电脑入门
不是有效Win32应用程序的解决方法

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

如何用 Win32 SDK 编程创建 Tri-pane HTML Help 窗口

Web开发
如何用 Win32 SDK 编程创建 Tri-pane HTML Help 窗口

不是有效的win32应用程序怎么解决

windows
不是有效的win32应用程序怎么解决

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

用CAD画一个骰子(原创教程)

用CAD画一个骰子(原创教程)

《去吧皮卡丘》精灵转生攻略

《去吧皮卡丘》精灵转生攻略
下拉加载更多内容 ↓