我该把Widget放在哪?

来源:互联网 发布:max384灯控台编程教程 编辑:程序博客网 时间:2024/04/29 16:55

这一周做一个新任务,请第三方公司做了一个桌面,我们想把Yahoo Widget放到桌面上面,我稀里糊涂的摆弄了一周,也不知道是不是走了弯路,先记录下来,以后想起来在看看吧。

首先想到的就是用SetWindowPos把Widget窗口放到TOPMOST,用spy测了半天,大概明白了原来父窗口和所有者窗口不完全一样,SetParent/GetParent和GetAncetor也有些很微妙的差别。以前一直是做Windows Mobile,小小的窗口很难跑一大堆层次复杂的窗口程序,所以一直没碰到过这个问题。查了一些资料,大概是说父(子)窗口描述窗口的层次关系,便于Windows窗口管理器管理(怎么管理,什么算法?),所有者窗口负责消息的传递(怎么传递,什么算法?)。CreateWindowEx函数中的hParent参数对于WS_POPUP类型的窗口就有特殊的身份了。任务进度关系,就不求甚解了。

Yahoo Widget可以选择设置为保持在所有窗口最下面,实际上就是设置其为桌面的子窗口。这个时候即使设置为TopMost也不会出现在其它窗口上面。于是又找到了SetParent函数把Widget设置为自己的伪桌面的子窗口,只要伪桌面在上面,Widget就在上面。

可是不知道该在什么时候做这项工作,如果用一个Timer不停探测,实在浪费能源。所以又想着用钩子函数钩Widget。大学的时候倒是看过不少写键盘记录器的教程,不过重来没实践过。翻来覆去看MSDN那几个函数的说明,大概作了一个,钩住Widget的过程函数,然后……,我又不知道拦截什么消息确定Widget被下放到桌面子窗口了,于是用机械的用spy测了一天,没有结果,一狠心,把钩子放到Show消息里面了。愿程序之神原谅我,好像最后的方案只不过是用了一个高超而隐晦的技巧,仍然是做浪费能源的事情。

任务过程中,又了解了不少知识的皮毛。不知道这些知识到了Windows 7还能用不。特别是在网上搜到一些虚拟桌面的技巧,好像还挺好玩,等有空的时候尝试一下。很多东西,难者不会,会者不难。可是,这些在系统中到处打洞补漏的活,实在又脏又累,虽说window不开源,但幸运的是后它还就只用那些函数接口,做不来也就可以搪塞上面了。到了Linux下面,只有想不到,没有做不到,嘿嘿,没有任何借口,那才是无间道呢。

原创粉丝点击