Lu Lin All Real Tech(2) 16 May 99 23:54:36 作者:陆麟 欢迎盗版,请注出处. 1999.5.16 今天我又要一下WIN9X TASKBAR的运作. 上次讲了用COM的方法把TASKBAR上的按钮干掉.那么TASKBAR自己 的运作又是怎么样的呢. 我讲一下流程吧.根据MS的文档,一个应用程序按钮出现在TASKBAR 上的条件是: 1.它是个UNOWNED的窗口(不属于系统的窗口). 2.窗口是应用程序的主窗口.应用程序的子窗口不会出现在TASKBAR 上.STYLE包含WS_OVERLAPPED. 3.该窗口处于ACTIVE状态. 但是如果满足了上述条件就会出现应用程序的按钮吗?很显然,我写 了这篇文章.肯定有不同于MS文档的地方:)这属于一些很技巧性的东 西. 一个TASKBAR COM组件的确可以控制按钮的产生和消亡,但是COM组件 是一个十分上层的东西.它通过什么控制TASKBAR上按钮呢. 答案就是:靠HOOK.什么HOOK呢?SHELL HOOK.当一个应用程序创建窗 口时,SHELL会发出一定序列的SHELL消息通知SHELL HOOK.然后,对 TASKBAR的操作就进行了.很令我本人不解.但是事实的确是这样的. 微软并没有把对TASKBAR的操作集成到SHOWWINDOW()等函数里.也许 根据模块化的原则,USER模块不应该操作SHELL模块的功能.但是这似 乎和微软的一贯做法有些不同,似乎对于系统的'集成'不利.因为一个 系统组件功能被剥离到了HOOK里. 那么哪个SHELL HOOK消息通知系统该有按钮该生成了呢?如果你自己 写个SHELL HOOK,你会发现拦截任何一个HSHELL消息都不能阻止系统 生成按钮.但是拦截HSHELL_WINDOWDESTROYED可以阻止系统删除按钮. 这里就是技巧中的技巧.UNDOCUMENTED,而且估计以后也不会有文档. 因为已经有了COM SHELL的文档告诉程序员如何操作按钮:) 任何一个单独的消息拦截都不能阻止系统产生按钮.但是通过3个消息 的联合拦截,却可以做到.那3个消息就是: HSHELL_WINDOWCREATED,HSHELL_WINDOWACTIVATED,HSHELL_GETMINRECT. 少一个都不行.只要这3个消息不流到当前HOOK之前的HOOK流里.系统将 在应用程序激活UNOWNED主窗口后不在TASKBAR上响应. 当然,这比COM实现有缺陷.不如COM调用简洁方便.但是,这离系统运作 又近了一层:) ... 看了我的信可是大补啊!:).陆麟 --- 蓝波95 v2.54 [NR] * Origin: SHANG HAI WILL UNIVERSITY BBS(57956523) (6:654/1007)