2010-10-21 14:55 把自己的窗口从TASKBAR上干掉!【转】

把自己的窗口从TASKBAR上干掉!
  27 Dec 98 13:58:41
  嘿嘿.可让我发现TASKBAR的秘密了:DDD
  每个WIN32应用程序一旦创建了窗口,那么他
  就会在TASKBAR上显示出来个按钮.要把按钮
  干掉,从SDK里不能发现任何有消除的接口.
  原来MS在SHELL扩展里又开始保留东西了.足
  足8个小时泡在电脑上.终于揭开了秘密.以下
  是我整理好后的COM接口:
  DECLARE_INTERFACE_(ITaskbarList, IUnknown)
  {
   STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
   STDMETHOD_(ULONG,AddRef) (THIS) PURE;
   STDMETHOD_(ULONG,Release) (THIS) PURE;
   STDMETHOD(ActivateTab)(HWND) PURE;
   STDMETHOD(AddTab)(HWND) PURE;
   STDMETHOD(DeleteTab)(HWND) PURE;
   STDMETHOD(HrInit)(void) PURE;
   };
  typedef ITaskbarList *LPITaskbarList;
  那么怎么使用呢?请看:
  /*--------------------------------------------------
  *陆麟写的把自己的WINDOW按钮从TASKBAR上干掉的源程序.
  *1998.12.27.
  *欢迎装载.请不要删除任何部分
  *------------------------------------------------*/
  #include "wnd.h"
  #include <objbase.h>
  #include <shlobj.h>
  DECLARE_INTERFACE_(ITaskbarList, IUnknown)
  {
   STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
   STDMETHOD_(ULONG,AddRef) (THIS) PURE;
   STDMETHOD_(ULONG,Release) (THIS) PURE;
   STDMETHOD(ActivateTab)(HWND) PURE;
   STDMETHOD(AddTab)(HWND) PURE;
   STDMETHOD(DeleteTab)(HWND) PURE;
   STDMETHOD(HrInit)(void) PURE;
  };//如果把这段加到SHLOBJ.H里那么以后就不要每次都再抄一遍了.
  typedef ITaskbarList *LPITaskbarList;//定义个指针.用起来更象在用SDK:)
  int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,
   LPSTR lpCmdLine,int){
   MSG msg;
   WND *lpWND;//WND负责创建窗口.是我自己写的类.
   LPITaskbarList pobj=0;
   CoInitialize(0);//初始化COM.开始奇妙的组件对象模型之旅:)
   lpWND=new WND(hInstance,lpCmdLine,SW_MAXIMIZE);//创建个WINDOW.
   CoCreateInstance(CLSID_TaskbarList,0,1,IID_ITaskbarList,
   (void **)&pobj);//CLSID_TaskbarList在SHLGUID.H里有定义
   //另外一个也有.幸亏MS还有这些常量在.否则
   //还要自己去查注册表.万幸万幸.这句程序会
   //返回一个指针列表.指向我上面公开的接口.
   pobj->HrInit();//一定要干这件事.又是初始化:(他会告诉SHELL我们
   //要有动作乐:)
   pobj->DeleteTab(lpWND->hWnd);//所有以上的代码归根结底就是为执行
   //这句代码作准备.他会干掉TASKBAR上
   //的按钮:)终于完工了.
   while (GetMessage(&msg,0,0,0))//这是很普通的消息循环.
   {
   TranslateMessage(&msg);
   DispatchMessage(&msg);
   }
   return 0;
  }
  以上含有基本的函数调用序列.其中WND是我自己写的类.(毕竟没兴趣学
  MFC了.自己写其实也很简单:))有关WND类的源程序没贴.大家应该要了也
  没有用.所以就不贴了.以上代码没有任何错误检查.请自己加进去.
  ... 看了我的信可是大补啊!:).陆麟
  --- 蓝波95 v2.54 [NR]
  * Origin: SHANG HAI WILL UNIVERSITY BBS(57956523) (6:654/1007)
  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]

经检验发现CoCreateInstance(CLSID_TaskbarList,0,1,IID_ITaskbarList,
   (void **)&pobj);//CLSID_TaskbarList在SHLGUID.H里有定义
这一步就不成功,返回8007007e,有任何人成功调用或者知道如何才能成功调用的话,敬请留言。多谢。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值