在MFC中注册自己的窗口类名

之所以产生这个想法,或者说关注这个问题,是因为想通过FindWindow找到(自己设计的程序中的)窗口的句柄。

一、关于MFC窗口类的一般知识:

一般情况下,MFC使用了默认的窗口属性来帮助我们建立窗口。这里单独说一下基于Dialog建立起来的程序,窗口有些是通过有些是Dialog(有名字/标题,但窗口类型名与其他基于Dialog的程序的窗口的窗口类型名相同;只能通过名字来查找),有些是DialogBar(既没有名字/标题,也没有可分辨的窗口类型名),因为MFC在帮助我们省去一些工作的同时,也使用了这些默认的窗口属性。

在这种情况下,如果使用FindWindow来找到DialogBar窗口的句柄,是比较难的。因此,我想可以通过修改DialogBar窗口的WNDCLASS类型名来达到这一点。

按照MSDN上的说法:

MFC应用程序产生的对话框和控件,这两者的窗口类类名由Windows提供。我们可以替换这些由Windows动态提供的名字,方法是在PreCreateWindow中注册我们自己的类并使用这个类。一般情况下,MFC提供的窗口类型名有下面两种方式:①Afx::%x:%x;②Afx::%x:%x:%x:%x。   这些%x所表示的16进制字符是用WNDCLASS结构的数据来填充的。MFC使用此技术,可以使得需要相同WNDCLASS结构的C++类可以共享同一个注册的窗口类。需要注意的是,与大多数简单的Win32应用程序不同,MFC应用程序只有一个WNDPROC。各个不同的窗口之所以表现出不同的特性,是因为重载了函数。

MFC提供的窗口类型名中,%x字符的可替换值如下:

WNDCLASS.hInstance, WNDCLASS.style, WNDCLASS.hCursor, WNDCLASS.hbrBackground, WNDCLASS.hIcon

①Afx::%x:%x中,hCursor、hbrBackground、hIcon是NULL。

二、修改窗口类的类名

通过对网络资料的搜索,找到了一种修改Dialog的WNDCLASS.lpszClassName的方法。参考文献①中有详细的描述,经实际验证可行。

该方法主要有两步:

①在rc资源文件中,找到要待修改的Dialog的资源描述信息,添加CLASS “窗口类型名”

②在APP类中的InitInstance进行窗口类型注册。


三、使用FindWindow或FindWindowEx查找窗口

函数声明:

HWND WINAPI FindWindow(  _In_opt_  LPCTSTR lpClassName,  _In_opt_  LPCTSTR lpWindowName);

HWND WINAPI FindWindowEx(  _In_opt_  HWND hwndParent,  _In_opt_  HWND hwndChildAfter,
  _In_opt_  LPCTSTR lpszClass,  _In_opt_  LPCTSTR lpszWindow);


关于FindWindow和FindWindowEx的使用注意事项:

在网上浏览的过程中,发现了很多人说这两个函数返回的句柄是0,怎么弄也找不到原因。实际上,可能是没有注意到这两个函数的使用说明。PS:我也犯了这样的错,花了大概半天的时间才找到原因。

在读MSDN关于这两个函数的说明时,有些地方不能漏掉。

FindWindow:

Retrieves a handle to the top-level window whose class name and window name match the specified strings. This function does not search child windows. This function does not perform a case-sensitive search.

这句话的意思是说,FindWindow是从顶层窗口中找到并返回匹配lpClassName和lpWindowName的窗口的句柄。这里的窗口必须是顶层的,即是Desktop的子窗口,不能使孙窗口或任何非子代的后代窗口。也就是说,如果匹配这两个字符串的窗口是某个顶层窗口的子窗口,则FindWindow返回0。

FindWindowEx

Retrieves a handle to a window whose class name and window name match the specified strings. The function searches child windows, beginning with the one following the specified child window. This function does not perform a case-sensitive search.

这句话的意思是,FindWindowEx从hwndParent的子窗口中查找并返回匹配参数的窗口句柄。返回的句柄所对应的窗口必须是hwndParent的子窗口;如果与参数匹配的窗口是hwndParent的非直接子代窗口(如:孙窗口什么的)或者是后代窗口中的某个控件中的窗口,则FindWindowEx返回0。

建议:使用FindWindow或者FindWindowEx,要明白待查找的窗口位于哪一个层级,是谁的子窗口。


参考文献:

① 如何改变MFC应用程序主窗口的类名http://www.cnblogs.com/menggucaoyuan/archive/2011/06/10/2077217.html

MFC窗口类名称http://msdn.microsoft.com/zh-cn/library/btbxa0ad.aspx

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值