呵呵,最近在研究SendMessage函数,其中需要用到m_hWnd,之后延伸着又尝试获得窗口的句柄,于是遇到了FindWindow函数,原型如下:

HWND FindWindow

(

 LPCSTR lpClassName,    //输入窗口的类名,其实需要是注册过的类名才行,否则是要报错或者查找失败的。

 LPCSTR lpWindowName, //输入窗口的名称,就是窗口上面蓝色的那行玩意儿写的字。

);

对于这个函数,如果按照窗口的名称查找,相信大家都非常简单,因为名称在rc文件里,是已经注册过的了(具体的待会给大家贴代码就能看明白了)。但如果大家使用我们自己定义的窗口名称查询,则往往会失败,甚至是报错!尤其是在使用SendMessage告知另一个窗口退出时,会导致内存泄露!

对于这样的情况,编译器不一定能告诉各位,所以,如果没有亲自注册窗口类的经验的话,建议大家如果要使用FindWindow函数获得窗口句柄的话,尽量通过 窗口的名称查询

言归正传,出现之前的那种严重情况的原因,是在于MFC并没有一个一个帮大家将我们派生的窗口类进行注册,而是使用的默认窗口类的方式,具体渊源似乎俺也说不大清楚(嘿嘿,见笑了。。。),咱只能引用这一段话:

“   在早期的MFC中 (MFC 4.0之前的版本)提供了大量的预定以的窗口类,但这些窗口类在默认下已经不再被提供了,因为涉及到多版本的技术问题(多个版本的MFC加载在同一个地址空间),如涉及到的一个实际的问题就是MFC应用程序和OLE控件都会用到MFC的DLLs。 ”

而默认的窗口类,一般类名都是“#32770(Dialog)”,这个大家通过Spy++检测窗口的时候就可以看到。

拿我这边的一个小程序为例:
默认的类名是 #32770(Dialog)

而红线之前的,就是“注册”过的窗口的名称,这个是MFC自动做了的。那么,我们能使用这个默认类名进行操作么?嘿嘿~大家试试嘛···所有的未注册窗口似乎都是这个类名哦。。。。

OK,返回话题,既然默认是这样的,那么如何修改呢?这个咱参阅了这位大大的文章:http://hi.baidu.com/iwangkun/blog/item/97fc18d5ef59dfc251da4b21.html

由于是英文的,可能有的朋友会望而生畏,所以,咱把自己的心得以及经验总结一下,翻译出来吧:

首先,请用记事本或写字本的模式,打开需要注册窗口的工程目录下的rc资源文件(各个朋友,建议大家先将工程备份一份,因为错误的修改,很容易导致整个工程出错哦!)。这个时候,请找到我们要注册的窗口的数据位置,这个很好找的:

因为每一个窗口的数据开始位置,都是以窗口的句柄开头的,

比如我要注册的窗口类的对应句柄是IDD_CARHIRESYSTEM_DIALOG,

那么打开文件后,稍微需找一下就会发现这个数据段:

IDD_CARHIRESYSTEM_DIALOG     DIALOGEX               0, 0, 400, 280 STYLE DS_MODALFRAME | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION |     WS_SYSMENU EXSTYLE WS_EX_APPWINDOW CAPTION "车辆出租系统 CarHireSystem" FONT 9, "宋体", 0, 0, 0x1 BEGIN     COMBOBOX        IDC_COMBO_CHANCE,23,35,83,95,CBS_DROPDOWNLIST | CBS_SORT |                     WS_VSCROLL | WS_TABSTOP     EDITTEXT        IDC_EDIT_SEARCH,125,33,83,15,ES_AUTOHSCROLL     DEFPUSHBUTTON   "查询",IDC_BUTTON_SEARCH,219,29,50,25     ........等等 END

如上所示,那么,我们接下来所要做事情,便是添加我们对窗口类的注册信息,

即:

IDD_CARHIRESYSTEM_DIALOG DIALOGEX 0, 0, 400, 280 STYLE DS_MODALFRAME | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION |     WS_SYSMENU EXSTYLE WS_EX_APPWINDOW CAPTION "车辆出租系统 CarHireSystem" CLASS "CCarHireSystemDlg"   //""双引号内的类名,可以随意,但注意一定要写对哦,后面还要用到的。 FONT 9, "宋体", 0, 0, 0x1 BEGIN     COMBOBOX        IDC_COMBO_CHANCE,23,35,83,95,CBS_DROPDOWNLIST | CBS_SORT |                     WS_VSCROLL | WS_TABSTOP     EDITTEXT        IDC_EDIT_SEARCH,125,33,83,15,ES_AUTOHSCROLL     DEFPUSHBUTTON   "查询",IDC_BUTTON_SEARCH,219,29,50,25     ........等等 END

然后保存文件,如此,基本上任务已经完成了,就差进行注册了。MFC中的注册函数是 :AfxRegisterClass,格式如下:

BOOL AFXAPI AfxRegisterClass(WNDCLASS *lpWndClass);

那么,我们要做的事情是什么呢?   ----- 在窗口完成初始化之前,对窗口类进行注册。于是,我们找到工程的App类,加入如下代码:

///////////////////////////////////////////////////////// WNDCLASS wc;
// Get the info for this class. // #32770 is the default class name for dialogs boxes. ::GetClassInfo(AfxGetInstanceHandle(), "#32770", &wc);
// Change the name of the class. wc.lpszClassName = "CCarHireSystemDlg"; //这里请再次注意,一定要保证和rc资源文件里保存的类名相同! // Register this class so that MFC can use it. AfxRegisterClass(&wc);

/////////////////////////////////////////////////////////

如上,只要AfxRegisterClass(&wc); 不返回FALSE,那么我们的类名注册就成功了!

演示截图:

这个时候,大家再使用FindWindow("CCarHireSystemDlg",NULL)函数,就可以正常使用了!

最后再次重申两点:

1.修改rc资源文件前,建议大家备份工程。当修改了rc文件后,如果没有加入上面的注册代码,或者加入位置出错,都会导致程序编译无问题,但执行报错!这一点,如果在rc资源文件里保存的类名称,与注册代码里的类名称不相同,也会导致执行报错。

2.使用FindWindow函数时,如果窗口类还并未注册,那么,建议直接将第一个参数设为NULL,同时在第二个参数上传入窗口的名称,进行查询。注意,是窗口的名称,窗口类生成的对象的窗口标题!如此,也不会导致错误。

转自

http://blog.csdn.net/atmcash4423/article/details/6606285

http://hi.baidu.com/%D5%B8%CC%EC/blog/item/d4a01fa0232126a0cbefd098.html

MFC注册窗口类以及FindWindow按窗口类名查询(避免用#32770获取窗口句柄)的更多相关文章

  1. MFC注册窗口类以及FindWindow按窗口类名查询

    很多玩游戏的人都知道一般游戏客户端程序是不允许双开的,就是说在同一游戏在启动的时候,是无法打开多个窗口.很多其他软件如酷狗播放器等也是这样.如果把打开的窗口最小化,这时重新启动程序,最小化的窗口会被显 ...

  2. VC/MFC程序开启关闭和打开自己或其他软件,更改窗口类

    一. 关闭自身软件 直接在需要关闭的位置输入 HANDLE hself = GetCurrentProcess(); TerminateProcess(hself, 0); 二.关闭其他软件 流程: ...

  3. 窗口类(Window Class)概述

    windows窗口编程(通常意义上的win32)有几个比较核心的概念:入口函数WinMain.窗口类Window Class.窗口过程.消息处理机制.通用控件.本文主要介绍窗口类的相关概念,包括: 窗 ...

  4. 窗口的子类化与超类化——子类化是窗口实例级别的,超类化是在窗口类(WNDCLASS)级别的

    1. 子类化 理论:子类化是这样一种技术,它允许一个应用程序截获发往另一个窗口的消息.一个应用程序通过截获属于另一个窗口的消息,从而实现增加.监视或者修改那个窗口的缺省行为.子类化是用来改变或者扩展一 ...

  5. ATL7窗口类详细剖析

    前言: ATL是微软继MFC之后提供的一套C++模板类库,小巧.精妙.效率极高.它的主要作用是为我们编写COM/DOM/COM+程序提供了丰富的支持.但是ATL只能写COM么?我以前只是MFC程序员的 ...

  6. 探索Win32系统之窗口类(转载)

    Window Classes in Win32 摘要 本文主要介绍win32系统里窗口类的运做和使用机制,探索一些细节问题,使win32窗口类的信息更加明朗化. 在本文中,"类", ...

  7. Window 窗口类

    窗口类 WNDCLASS 总结 总结为下面的几个问题: . 什么是窗口类 . 窗口类的三种类型 . 窗口类各字段含义 . 窗口类的注册和注销 . 如何使用窗口类,子类化.超类化是什么 下面分别描述: ...

  8. 通用窗口类 Inventory Pro 2.1.2 Demo1(下续篇 ),物品消耗扇形显示功能

    本篇想总结的是Inventory Pro中通用窗口的具体实现,但还是要强调下该插件的重点还是装备系统而不是通用窗口系统,所以这里提到的通用窗口类其实是通用装备窗口类(其实该插件中也有非装备窗口比如No ...

  9. 通用窗口类 Inventory Pro 2.1.2 Demo1(下)

    本篇想总结的是Inventory Pro中通用窗口的具体实现,但还是要强调下该插件的重点还是装备系统而不是通用窗口系统,所以这里提到的通用窗口类其实是通用装备窗口类(其实该插件中也有非装备窗口比如No ...

随机推荐

  1. ES6第三节:变量的解构赋值

    ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构.下面我们看实际的例子: 一.数组解构: let [a,b,c] = [1,2,3]; console.log(a); //a ...

  2. springboot整合Beetl、BeetlSql实现ajax分页

    Beetl是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,超过当前流行的模板引擎.而且还易学易用. BeetSql是一个 ...

  3. 洛谷——P1307 数字反转

    https://www.luogu.org/problem/show?pid=1307#sub 题目描述 给定一个整数,请将该数各个位上数字反转得到一个新数.新数也应满足整数的常见形式,即除非给定的原 ...

  4. Swift视频教程,Swift千人学iOS开发编程语言

    此时大家站在同一起跑线.Swift语言将将是下一个风靡程序猿界的编程语言,是否能抢占先机,近在咫尺. 本期推荐Swift编程语言视频教程,内容包含:开发环境基本使用.数据类型和常量.数据自己主动检查和 ...

  5. Linux搭建aspx.net环境之:CentOs 7 安装 Mono 和 Jexus 步骤记录

    1 因为163没有CentOs7的镜像.所以没有加这个 wget  http://mirrors.163.com/.help/CentOS6-Base-163.repo cd /etc/yum.rep ...

  6. Python - 字典(dict)删除元素

    字典(dict)删除元素, 能够选择两种方式, dict.pop(key)和del dict[key]. 代码 # -*- coding: utf-8 -*- def remove_key(d, ke ...

  7. worktools-源码下拉问题

    今天下拉源码的时候,出现了一个问题,就是当地的内容跟仓库的内容冲突,导致merge冲突.这时候CC指令不能用.然后希望通过checkout到其他分支,然后cc掉的.结果没办法切换到其他分支,一直停留在 ...

  8. holder.js如何使用

    holder.js的使用 一.总结 一句话总结:使用:holder.js后面接图片宽高 <img src="holder.js/300x200" /> 1.holder ...

  9. 35.Node.js GET/POST请求

    转自:http://www.runoob.com/nodejs/nodejs-module-system.html 在很多场景中,我们的服务器都需要跟用户的浏览器打交道,如表单提交. 表单提交到服务器 ...

  10. npm install (让别人下载自己的包)

    好几天没更新了,再这里跟大家说声抱歉,今天来点干货. 发布一个包在npm上,可以供世界所有人使用,想一下,以前我们做项目,都是在npm install 别人的包,什么时候才能install我们自己的包 ...