使用未公开API ITrayNotify控制托盘图标的隐藏和显示
来源:互联网 发布:四叶草引导mac和win7 编辑:程序博客网 时间:2024/06/06 18:06
Vista开始,右下角的托盘图标默认会隐藏起来,要手动设置显示。在网上找了一圈还真发现有显示的方法,使用的是微软未公开的ITrayNotify接口。
代码1 来源 http://bbs.pediy.com/showthread.php?p=1382584
代码2 Chromium源代码
就发个链接吧 https://chromium.googlesource.com/chromium/src.git/+/master/chrome/browser/ui/views/status_icons/
代码3 根据代码1修改来的 使用类模板可支持Win8系统
更正:居然被坑了 UnregisterCallback的参数不用传址
如果想让图标一直显示的话就等到程序退出的时候再UnregisterCallback即可,用户隐藏后马上会显示
代码1 来源 http://bbs.pediy.com/showthread.php?p=1382584
#include "stdafx.h"#include <conio.h>#include <windows.h>#include <Shlwapi.h>#pragma comment(lib, "shlwapi.lib")typedef struct tagNOTIFYITEM{ PWSTR pszExeName; PWSTR pszTip; HICON hIcon; HWND hWnd; DWORD dwPreference; UINT uID; GUID guidItem;} NOTIFYITEM, *PNOTIFYITEM;class __declspec(uuid("D782CCBA-AFB0-43F1-94DB-FDA3779EACCB")) INotificationCB : public IUnknown{ virtual HRESULT __stdcall Notify (ULONG, NOTIFYITEM *) = 0;};class __declspec(uuid("FB852B2C-6BAD-4605-9551-F15F87830935")) ITrayNotify : public IUnknown{public: virtual HRESULT __stdcall RegisterCallback(INotificationCB* callback) = 0; virtual HRESULT __stdcall SetPreference(const NOTIFYITEM* notify_item) = 0; virtual HRESULT __stdcall EnableAutoTray(BOOL enabled) = 0;};class __declspec(uuid("D133CE13-3537-48BA-93A7-AFCD5D2053B4")) ITrayNotifyWindows8 : public IUnknown{public: virtual HRESULT __stdcall RegisterCallback(INotificationCB* callback, unsigned long*) = 0; virtual HRESULT __stdcall UnregisterCallback(unsigned long*) = 0; virtual HRESULT __stdcall SetPreference(NOTIFYITEM const*) = 0; virtual HRESULT __stdcall EnableAutoTray(BOOL) = 0; virtual HRESULT __stdcall DoAction(BOOL) = 0;};const CLSID CLSID_TrayNotify = {0x25DEAD04, 0x1EAC, 0x4911, {0x9E, 0x3A, 0xAD, 0x0A, 0x4A, 0xB5, 0x60, 0xFD}};class NotificationMgr : public INotificationCB{public: NotificationMgr(){ m_pTrayNotify = NULL; } HRESULT __stdcall QueryInterface ( REFIID riid, PVOID *ppv) { if (ppv == NULL) return E_POINTER; if (riid == __uuidof (INotificationCB)) { *ppv = (INotificationCB *) this; }else if (riid == IID_IUnknown) { *ppv = (IUnknown *) this; }else{ return E_NOINTERFACE; } ((IUnknown *) *ppv) -> AddRef (); return S_OK; } ULONG __stdcall AddRef (VOID) { return 1; } ULONG __stdcall Release (VOID) { return 1; } HRESULT __stdcall Notify (ULONG Event, NOTIFYITEM * NotifyItem){ printf("event:%d Preference:%d id:%d path:%ls\n", Event, NotifyItem->dwPreference, NotifyItem->uID, NotifyItem->pszExeName); if (StrStrIW(NotifyItem->pszExeName, L"qq.exe")){ if (m_pTrayNotify){ NotifyItem->dwPreference = 2; m_pTrayNotify->SetPreference(NotifyItem); } } return S_OK; }public: ITrayNotify * m_pTrayNotify;};int _tmain(int argc, _TCHAR* argv[]){ ITrayNotify *pTrayNotify; NOTIFYITEM NotifyItem = {0}; NotificationMgr NotiMgr; CoInitialize(NULL); // // for win7 // HRESULT hr = CoCreateInstance ( CLSID_TrayNotify, NULL, CLSCTX_LOCAL_SERVER, __uuidof(ITrayNotify), (PVOID *)&pTrayNotify); if (!SUCCEEDED(hr)){ printf("create instance of ITrayNotify error\n"); return -1; } // // register callback // NotiMgr.m_pTrayNotify = pTrayNotify; hr = pTrayNotify->RegisterCallback(&NotiMgr); printf("over\n"); pTrayNotify->RegisterCallback(NULL); pTrayNotify->Release(); _getch(); return 0;}
代码2 Chromium源代码
就发个链接吧 https://chromium.googlesource.com/chromium/src.git/+/master/chrome/browser/ui/views/status_icons/
代码3 根据代码1修改来的 使用类模板可支持Win8系统
更正:居然被坑了 UnregisterCallback的参数不用传址
#include <tchar.h>#include <conio.h>#include <windows.h>// The known values for NOTIFYITEM's dwPreference member.enum NOTIFYITEM_PREFERENCE {// In Windows UI: "Only show notifications."PREFERENCE_SHOW_WHEN_ACTIVE = 0,// In Windows UI: "Hide icon and notifications."PREFERENCE_SHOW_NEVER = 1,// In Windows UI: "Show icon and notifications."PREFERENCE_SHOW_ALWAYS = 2};typedef struct tagNOTIFYITEM {PWSTR pszExeName;PWSTR pszTip;HICON hIcon;HWND hWnd;NOTIFYITEM_PREFERENCE dwPreference;UINT uID;GUID guidItem;} NOTIFYITEM, *PNOTIFYITEM;MIDL_INTERFACE("D782CCBA-AFB0-43F1-94DB-FDA3779EACCB") INotificationCB : public IUnknown{public:BEGIN_INTERFACEvirtual HRESULT STDMETHODCALLTYPE Notify(ULONG, NOTIFYITEM *) = 0;END_INTERFACE};MIDL_INTERFACE("FB852B2C-6BAD-4605-9551-F15F87830935") ITrayNotify : public IUnknown{public:BEGIN_INTERFACEvirtual HRESULT STDMETHODCALLTYPE RegisterCallback(INotificationCB* callback) = 0;virtual HRESULT STDMETHODCALLTYPE SetPreference(const NOTIFYITEM* notify_item) = 0;virtual HRESULT STDMETHODCALLTYPE EnableAutoTray(BOOL enabled) = 0;END_INTERFACE};MIDL_INTERFACE("D133CE13-3537-48BA-93A7-AFCD5D2053B4") ITrayNotifyWin8 : public IUnknown{public:BEGIN_INTERFACEvirtual HRESULT STDMETHODCALLTYPE RegisterCallback(INotificationCB* callback, unsigned long*) = 0;virtual HRESULT STDMETHODCALLTYPE UnregisterCallback(unsigned long) = 0; // 被坑了 这里的参数不用传址virtual HRESULT STDMETHODCALLTYPE SetPreference(NOTIFYITEM const*) = 0;virtual HRESULT STDMETHODCALLTYPE EnableAutoTray(BOOL) = 0;virtual HRESULT STDMETHODCALLTYPE DoAction(BOOL) = 0;END_INTERFACE};const CLSID CLSID_TrayNotify = { 0x25DEAD04, 0x1EAC, 0x4911,{ 0x9E, 0x3A, 0xAD, 0x0A, 0x4A, 0xB5, 0x60, 0xFD } };template <class type>class NotificationMgr : public INotificationCB {public:NotificationMgr(type *pTrayNotify) : m_pTrayNotify(pTrayNotify) {}IFACEMETHODIMP QueryInterface(REFIID riid, PVOID *ppv) {if (ppv == NULL)return E_POINTER;if (IsEqualIID(riid, IID_IUnknown))*ppv = static_cast<IUnknown *>(this);else if (IsEqualIID(riid, __uuidof (INotificationCB)))*ppv = static_cast<INotificationCB *>(this);elsereturn E_NOINTERFACE;reinterpret_cast<IUnknown*>(*ppv)->AddRef();return S_OK;}IFACEMETHODIMP_(ULONG) AddRef() { return 1; }IFACEMETHODIMP_(ULONG) Release() { return 1; }IFACEMETHODIMP Notify(ULONG Event, NOTIFYITEM *NotifyItem) {if (wcsstr(_wcslwr(NotifyItem->pszExeName), L"qq.exe")) {if (m_pTrayNotify) {NotifyItem->dwPreference = PREFERENCE_SHOW_ALWAYS;m_pTrayNotify->SetPreference(NotifyItem);}}return S_OK;}private:type * m_pTrayNotify;};int _tmain(int argc, _TCHAR* argv[]){CoInitialize(NULL);IUnknown *pIUnk;HRESULT hr = CoCreateInstance(CLSID_TrayNotify, NULL, CLSCTX_LOCAL_SERVER, IID_PPV_ARGS(&pIUnk));if (SUCCEEDED(hr)){ITrayNotifyWin8 *pTrayNotify8;hr = pIUnk->QueryInterface(&pTrayNotify8);if (SUCCEEDED(hr)) // Win8{ULONG callback_id = 0;NotificationMgr<ITrayNotifyWin8> NotiMgr8(pTrayNotify8);hr = pTrayNotify8->RegisterCallback(&NotiMgr8, &callback_id);if (SUCCEEDED(hr))pTrayNotify8->UnregisterCallback(callback_id);pTrayNotify8->Release();}else // Legacy{ITrayNotify *pTrayNotify;hr = pIUnk->QueryInterface(&pTrayNotify);if (SUCCEEDED(hr)){NotificationMgr<ITrayNotify> NotiMgr(pTrayNotify);hr = pTrayNotify->RegisterCallback(&NotiMgr);if (SUCCEEDED(hr))pTrayNotify->RegisterCallback(NULL);pTrayNotify->Release();}}pIUnk->Release();}_getch();return 0;}
如果想让图标一直显示的话就等到程序退出的时候再UnregisterCallback即可,用户隐藏后马上会显示
0 0
- 使用未公开API ITrayNotify控制托盘图标的隐藏和显示
- 控制托盘图标显示或隐藏
- 托盘图标的任意隐藏
- [C++]隐藏/删除/显示托盘图标
- 未公开的API: addFrameScript()
- 未公开的API: addFrameScript()
- Windows未公开的API
- 隐藏指定程序托盘图标的方法
- 隐藏指定程序托盘图标的方法
- delphi 隐藏指定程序的托盘图标
- c#显示隐藏的窗体和托盘中的程序
- 隐藏托盘图标
- VC 隐藏托盘图标
- android使用sdk中未公开API
- [转载]C#一键隐藏QQ/MSN,显示/隐藏系统托盘图标,获取托盘图标
- 显示托盘图标
- 托盘图标显示
- 整理的一些未公开的API
- ubuntu下搭建samba服务,实现和window的文件共享
- apache+tomcat反向代理
- Ubuntu下安装Packet Tracer5.3过程
- Windows定时邮件服务笔记
- Atitit. 衡量项目规模 ----包含的类的数量 .net java类库包含多少类 多少个api方法??
- 使用未公开API ITrayNotify控制托盘图标的隐藏和显示
- SGU 194. Reactor Cooling【无源汇上下界最大流】
- 微博开发笔记上(未完待续)
- Collections分析之SynchronizedList
- Atitit.检测文本文件的编码 自动获取文件的中文编码
- 轮播图2(jQ)
- 浅谈Android中微信的文本,音频,视频,链接,表情,图片分享接口开发详解
- Zookeeper应用--配置管理
- 自定义UIActionSheet