Jiang's C++ Space

创作,也是一种学习的过程。

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
用过Windows Mobile的人都知道,一般情况下,按下挂机键(就是挂电话那个按键,通常是红色的),就相当于Windows XP中点了那个“显示桌面”的图标,所有窗口都最小化,桌面显示出来了,Windows Mobile中的“今日”(Today)就相当于Windows的桌面,按挂机键,“今日”就显示出来了,别的窗口都隐藏(最小化)。

这个效果我是想模仿一个叫Spb Home的桌面美化程序,用过Spb Home的都很清楚这是怎样一个效果。

那我现在有这么个需求,我希望我的程序不被挂机键隐藏,也就是说希望我的程序取代“今日”,在别的窗口都被隐藏或关闭的时候,我的程序窗口依旧显示。下面是我的思路轨迹:

做Windows编程出身的我首先想到WM_SHOWWINDOW消息,我程序的主窗口被最小化的时候应该能够收到这个消息,我只要对这个消息进行相关处理即可,但令我感到意外的是Windows Mobile似乎没有这个消息,到网上search,没有答案,纳闷……

没有WM_SHOWWINDOW,终归有别的吧?于是我用Windows CE Remote Spy观察一个窗口在按下挂机键时候接收到的消息,分析了多种情况后,我发现有一个消息确实是按下挂机键时候能接收到的,但这个消息没有在MSDN中被提及,我只知道它的值为0xC005。



响应这个消息,每次收到的时候调用一下SetForegroundWindow(),这么一来,果然奏效了!但问题来了,每次按挂机键的时候,屏幕总要闪一下,为什么?原因就是我的窗口收到0xC005消息的时候,它已经被隐藏了,我重新把它show出来当然要闪一下,这个效果并不理想。

继续想办法,那能不能通过钩子来重定义挂机键的动作呢?后来想想不妥,因为我并不是要屏蔽或者修改挂机键的功能,我只是不想让我的窗口被它隐藏而已,况且钩子是undocumented的东西,恐怕不太好。

再思考,如果挂机键的功能就是被默认地定义为隐藏所有窗口,那我如何阻止它呢?这是不太可能的吧?所以我想来想去还是想到Spb Home了,看看Spb Home的窗口究竟有什么不同,结果还真的有了新发现,问题也因此得解。大家看:

看窗口风格这个值,0x90010000,跟我的程序最大的不同是:首bit是1!第一个bit是什么意思呢?是WS_POPUP,于是我有样学样,在我的窗口上加上WS_POPUP属性,就OK了!WS_POPUP窗口不会自动最大化显示,我们要指定它的显示位置和大小,这是跟overlapped window的不同,关于popup,overlapped这些东西,我有另一篇比较完整的文章来阐述的,地址是:
http://blog.csdn.net/guogangj/archive/2008/12/06/3460267.aspx

问题终于解决了,没想到处理起来这么简单,但知道这么弄,却让我研究了好久。
posted on 2010-07-14 15:09 Jiang Guogang 阅读(618) 评论(0)  编辑 收藏 引用 所属分类: Windows Embedded Programming

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理