#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(HrInit)(void) PURE; STDMETHOD(AddTab)(HWND) PURE; STDMETHOD(DeleteTab)(HWND) PURE; STDMETHOD(ActivateTab)(HWND) PURE; STDMETHOD(SetActiveAlt)(HWND) PURE; }; typedef ITaskbarList *LPTASKBARLIST;
注意和 Lv0 兄的定义有点不同,得到了定义,就可以用它控制 Taskbar 了,下面是去掉窗口的 Taskbar 图标的方法,其他以此类推:
LPTASKBARLIST pTaskbarList = NULL; if(SUCCEEDED( ::CoInitialize(NULL) )) { if(SUCCEEDED( ::CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_ITaskbarList, (void **)&pTaskbarList) )) { if(SUCCEEDED(pTaskbarList->HrInit())) { CWnd* pMainWnd = AfxGetMainWnd(); VERIFY( SUCCEEDED( pTaskbarList->DeleteTab( pMainWnd->GetSafeHwnd() ) ) ); } pTaskbarList->Release(); } ::CoUninitialize(); }
注意,这段代码必须在窗口已经建立好,TaskBar 上已出现图标后调用,不然 hWnd 在 TaskBar 上还不拥有图标,DeleteTab 不起作用。
另外的去掉图标的方法还有:
使用 WS_EX_TOOLWINDOW 标志创建窗口,或者在 OnCreate 中调用 ModifyStyleEx(0, WS_EX_TOOLWINDOW);
也可以去掉图标。