当前位置:C++技术网 > 精选软件 > Windows零基础入门:4.6 通过窗口标题查找窗口并获取其窗口类的图标句柄

Windows零基础入门:4.6 通过窗口标题查找窗口并获取其窗口类的图标句柄

更新时间:2015-10-29 21:10:37浏览次数:1+次

    相信通过4.2-4.5节课的介绍,获取窗口类信息的实现,你已经熟悉了吧。如果你还不知道怎么搞,那就不要厚着脸皮往后看咯。学习只看不动手不动脑是最为可耻的。我们的课程讲的已经是零基础入门的了,并且都是结合实践了讲述验证知识的,如果你不动手,能学到的就真是微乎其微了。既然花时间学习了,就一次性学好吧。
    因为本节课的知识是简单的,所以又额外补充一些项目经验,结合本节课的知识来讲解。这个例子是很有意思的,就是“借鸡下蛋”!我们程序没有漂亮的程序图标,但是只要有一个程序运行了,它还有好看的图标,我们就可以借为自己用。程序图标就是程序窗口左上角和任务栏上显示的图标咯。
    好了,我们先看看获取图标的原理吧。
    我们这里是使用窗口类关联的窗口图标句柄来获取图标。我们要获取窗口类的图标句柄,使用如下代码:

HICON hIcon = (HICON)GetClassLong(hwnd, GCL_HICON);

     这个代码我就不解释了,和上一节课《Windows零基础入门:4.5 获取窗口类所属的应用程序实例句柄》的大同小异,自己融会贯通吧。还不懂的话,留言吧。
    看吧,获取窗口类的图标句柄就这么简单。但是为了完整性,我们并不是走过场似的就此别过,这样说是融会贯通就行了。但是很多人,不眼见为实,自己总是感觉似乎是那么回事,虽然道理差不多,但是能完整的介绍,那是最好的。当然,不是介绍怎么获取这点东西了。不然,上面就已经结束了,这样实在没什么意思。而我们真正缺少的就是使用这些知识的真实案例。虽然你知道了如何获取图标句柄,但通常也被一些细节卡住。比如前面你可能被GetClassLong返回的LONG与HICON、HINSTANCE等困住。我们为了让你更多的掌握,花费了很多心血促进你理解,通过实战代码来加深你的印象,通过鄙视来促使你动手,最终通过讲道理促使你思考,如果你还是懒学不会的话,你就找个墙撞几下吧。千万别撞脑残了,不然我就麻烦了,哈哈哈。我不负责任的哦。
    我们要提取别人窗口的图标,那么首先要得到别人的窗口句柄咯。我们第一步就是要得到别人窗口的句柄,否则就不用继续了。那么窗口肯定是要运行起来的程序的,这样窗口的资源都被加载到内存了,这样我们才能得到窗口对应的窗口类的图标句柄咯。我们用API函数FindWindow函数来查找窗口。
    FindWindow函数有两个参数,第一个参数是窗口所属的窗口类名,第二个参数是窗口的标题。如果第一个参数传入NULL即0,那么表示从运行的所有窗口中查找,查找的唯一依据就是窗口的标题了。好了,我们为了方便,就只用窗口标题咯。
    好啦,那么我们通过窗口标题查找的窗口句柄的代码如下:

HWND hWndFind = FindWindow(NULL, _T("射手影音播放器"));

     我就来获取射手影音播放器的图标,播放器的界面如下:

   
    左上角的那个图标看到了吗?我们就是要得到它哦。我们通过FindWindow找到了播放器的窗口句柄了哦。这里必须注意一点哦,运行程序前,保证播放器已经运行了哦,不然获取句柄会失败的哦。
    获取了播放器的窗口句柄后,就用本节课介绍的获取窗口类句柄的方法得到播放器的窗口类的图标句柄咯。也就是开始句代码咯。不过句柄要改成得到的播放器的窗口句柄咯。
    好了。最后一步就是将得到的窗口句柄设置到自己的窗口中咯。先看看自己的窗口的图标句柄咯,如下图所示的左上角咯:
   
    是不是很原始,是不是很懒的自己去换咯。“借鸡生蛋”的最后一步就是吃了鸡蛋咯。修改窗口类信息的函数就是SetClassLong,前面两个参数和GetClassLong一样,第三个参数就是要设置的值。这个在前面的部分介绍过,也不算陌生咯。第三个参数需要的是LONG类型,所以我们要强制转换一下。在获取的时候不是也从LONG转成了其他类型嘛,现在又转回去咯。那么设置自己窗口的窗口类的图标的代码如下:

SetClassLong(hwnd, GCL_HICON, (LONG)hIcon);

     设置之后,我们的窗口华丽变身了哦,看下面的图:
   
    再看看任务栏,哈哈哈。两个射手播放器的图标,右边一个就是我们的程序的图标哦。如下图所示:
   
    是不是有点小激动呢?赶紧动手吧,不然就等着被鄙视吧。哈哈哈。