陈海军
摘要:Windows平台上面缺乏一款能够统一整合各类应用程序窗口的通用软件,因此文中根据Windows操作系统下应用程序运行的消息机制,通过注入挂载钩子函数,截获并处理相关消息,提出了分屏框架窗口软件的开发设计思路,并给予了相应的实现算法。
关键词:消息;钩子;共享数据段;分屏;Splash Window
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2015)14-0064-02
Abstract:On Windows system platform, there is a lack of application that can integrate all kinds of software running windows, this paper analysis application running message theory and hook mechanism, provide design ideas of ‘snap views software, and give the corresponding key algorithms.
Key words:message; hook; share data seg; sap view; splash window
目前,在Windows平台上面,各个领域、各种功能的应用软件数不胜数,有很多软件需要搭配使用,因此,大量工作需要在不同的应用窗口中切来切去,影响工作效率,为解决这个问题,微软从Win8开始,为宽屏设备用户提供的“分屏视图(Snap Views)”功能,可以将两个需要常在视线内的应用同时并排放在Win8屏幕上便于查看。不过Win8系统中的“分屏视图(Snap Views)”功能有诸多限制,比如屏幕分辨率必须在1366×768像素以及以上才能使用,而且只能有两个应用同时显示等等。本文探讨了如何实现一个通用的软件可以将不同的应用程序整合到同一个框架窗口。
1 系统分析
如果要整合各种Windows窗口,必须要深入了解Windows应用程序的运行机制。
1.1 Windows应用程序运行的机制
Windows应用程序是基于消息驱动的。在Windows中发生的事件都可以用消息来表示。针对每一个正在执行的Windows应用程序,Windows系统为其建立一个应用程序消息队列,Windows系统将属于该程序的各种消息推送到这个队列中,应用程序中的“Message Loop”的消息循环处理代码,用来从消息队列中依次取出消息并根据其中信息将其分发到相应的“Windows Process”窗口处理函数中去。如图1所示。
1.2 Windows应用程序窗口对象关系
应用程序窗口对象之间存在四种关系,即拥有者(owner)、父亲(parent)、孩子(child)、兄弟(sibling)。如果一个窗口的parent非空,则parent和它之间就建立了父子关系。父子关系决定了:
1)窗口在屏幕上面的显示位置。父窗口提供了用来定位子窗口的坐标系统,一个子窗口只能显示在它的父窗口的客户区中,之外的部分将被裁减。这个裁减法则决定了如果父窗口不可见,则子窗口肯定不可见。如果父窗口移动到了屏幕之外,子窗口也一样。
2)通常情况下、窗口之间消息的传递是和窗口关系相关的,通知消息会首先发送给父窗口,然后再转发到各个子窗口。
3)当父窗口被隐藏时,它的所有子窗口也被隐藏。
4)父窗口被销毁的时候,它所拥有的子窗口都会被销毁。
从以上的分析可知,要整合控制Windows下面各种应用程序,必须实现对应用程序消息的截获、分析和处理。要做到这一点,这里主要通过两种手段,一是指定应用程序的父窗口为本程序框架窗口。二是利用Windows钩子机制截获应用程序的消息进行处理。
2 系统设计与实现
软件主要分为两个部分程序,一个是窗口主界面程序,主要负责展示和接收用户输入的消息。另外一个是动态链接库,负责钩子函数的注入和消息的截获处理。
2.1 主窗口程序主要运行流程(如图2所示)
其中需要注意的几个地方是:
1)在枚举查找应用程序窗口的时候,一定要找到应用程序的顶级窗口,不要错误捕获应用程序中的子窗口。
2)有些应用程序启动较慢,所以在启动的时候,有启动窗口(Splash Window),系统应该能够自动识别,跳过启动窗口。
具体相关代码如下:
3 结束语
本文通过对Windows下应用程序运行机制和消息机理的分析,探讨了实现通用的分屏软件的方法,该软件目前运行良好,基本能够满足日常工作需求,为通过一个框架窗口整合不同的应用程序提供了较好的解决方案。
参考文献:
[1] Charles Petzold. Windows程序设计[M]. 北京: 清华大学出版社, 2010.
[2] Jeffrey Richter. Windows核心编程[M]. 北京: 机械工业出版社, 2008.
[3] Mark Russinovich. 深入解析Windows操作系统[M]. 北京: 人民邮电出版社, 2012.
[4] 张银奎. 软件调试[M]. 北京: 电子工业出版社, 2008.
[5] 毛德操. Windows内核情景分析[M]. 北京: 电子工业出版社, 2009.
[6] 潘爱民. Windows内核原理与实现[M]. 北京: 电子工业出版社, 2010.
[7] 侯俊杰. 深入浅出MFC[M]. 武汉: 华中科技大学出版社, 2001.
[8] Jeff Prosise. MFC Windows程序设计[M]. 北京: 清华大学出版社, 2007.