TASKBAR的奥秘

原创 2000年08月24日 17:36:00
Lu Lin
All
把自己的窗口从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]
* Origin: SHANG HAI WILL UNIVERSITY BBS(57956523) (6:654/1007)

任务栏的一系列操作

头文件内添加成员变量 ITaskbarList3* pTaskbar; CoInitialize(0); //初始化COM组件,用于支持任务栏显示进度。 CoCreateInstance(CLSI...
  • HLW0522
  • HLW0522
  • 2016年08月26日 17:40
  • 277

Winforms: Windows 7中Taskbar的新效果(1)——概述

Win7推出之后,很多用户发现Windows的界面漂亮了很多。在这些界面中,Taskbar是最引人注目的一个更新。在最新的Taskbar中,缩略图能显示更加丰富的信息。右键点击Taskbar上的按钮,...
  • cadcisdhht
  • cadcisdhht
  • 2010年03月28日 17:28
  • 2493

C# Windows 7任务栏开发之进度条(Progress Bar)

Windows 7 任务栏为我们增添了许多其他功能:Jump Lists,Window Preview,Progress Bar,Overlay Icon 等等。       新任务栏的功能使我们的...
  • aoshilang2249
  • aoshilang2249
  • 2015年04月28日 06:31
  • 3041

TASKBAR的奥秘

Lu LinAll把自己的窗口从TASKBAR上干掉!27 Dec 98  13:58:41嘿嘿.可让我发现TASKBAR的秘密了:DDD每个WIN32应用程序一旦创建了窗口,那么他就会在TASKBA...
  • ghj1976
  • ghj1976
  • 2000年08月24日 17:36
  • 1707

TASKBAR的奥秘

2000年08月24日 17:36:00 Lu LinAll把自己的窗口从TASKBAR上干掉!27 Dec 98 13:58:41嘿嘿.可让我发现TASKBAR的秘密了:DDD每个WIN3...
  • softart
  • softart
  • 2007年10月27日 06:55
  • 308

《编码的奥秘》目录摘要及读书笔记

本文由Markdown语法编辑器编辑完成。渴望交流是大多数人的天性。在本书中,“编码”通常指一种在人和机器之间进行信息转换的系统。换句话说,编码即是交流。有时我们将编码看得很神秘,其实大多数编码并非都...
  • inter_peng
  • inter_peng
  • 2016年08月06日 01:17
  • 1164

隐藏窗口任务栏图标的三种方法

http://blog.csdn.net/harbinzju/article/details/7047485 本文介绍三种方法,可以实现隐藏窗口在任务栏中的图标。其中前两种比较坑爹,不建议使...
  • liuhongxiangm
  • liuhongxiangm
  • 2012年07月05日 13:07
  • 612

Windows 7程序开发系列之一(任务栏篇)

       Windows 7 引入了很多新特性,其中最直观的莫过于用户界面上的变化。很多人也因为不能适应这种变化而回到了XP。但是在我看来这些新的特性却是一种进步,使用了一段时间之后,也萌生了要做...
  • ntwilford
  • ntwilford
  • 2010年05月25日 20:56
  • 12263

《编码的奥秘》读后感

历经两周左右的时间,终于把《编码的奥秘》这本书看完了。不得不说,这真是一本好书,深入浅出的讲解了大量与计算机与编码有关的东西。十分推荐对计算机有兴趣的朋友看看这本书,无论有没有技术功底,是否专业人士,...
  • u012745215
  • u012745215
  • 2015年05月18日 00:29
  • 3067

关于《编程的奥秘》一书未说完的话

关于《编程的奥秘》一书未说完的话第一部分 写作缘由 2006年1月,在春节前的一星期,我从出版社终于拿到了样书,不久,在海淀图书城的科技书店中也看到了这本书,只不过被摆在一个很不显眼的角落,不知道有没...
  • bitfan
  • bitfan
  • 2006年01月25日 22:33
  • 10740
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:TASKBAR的奥秘
举报原因:
原因补充:

(最多只允许输入30个字)