TNB Library
TnbTasktrayIcon.h
[詳解]
1#pragma once
11#include "TnbSync.h"
12#include "TnbStr.h"
13
14
15
16#include <shellapi.h>
17#ifndef _WIN32_WCE
18 #pragma comment(lib, "shell32.lib")
19#endif
20
21
22
23//TNB Library
24namespace TNB
25{
26
27
28
65{
66public:
67
80 struct IListener
81 {
83 virtual ~IListener(void) {}
84
94 virtual void OnNotifyTasktrayIcon(UINT uMsg, const POINT& tPoint) = 0;
95
96 private:
97 friend class CTasktrayIcon;
98 };
99
105 explicit CTasktrayIcon(UINT uID = 0)
106 {
107 m_icondata.uID = uID;
108 m_icondata.uCallbackMessage = ::RegisterWindowMessage(CStr::Fmt(_T("__SSA_%u"), uID));
109 m_icondata.ResetFlag();
110 m_boShow = false;
111 m_piListener = NULL;
112 m_uTaskbarCreatedMessage = ::RegisterWindowMessage(_T("TaskbarCreated"));
113 m_idMenu = 0;
114 m_hMenu = NULL;
115 }
116
118 virtual ~CTasktrayIcon(void)
119 {
120 Hide();
121 }
122
128 void SetListener(IListener* piListener)
129 {
130 m_piListener = piListener;
131 }
132
142 bool RelayEvent(UINT message, WPARAM wParam, LPARAM lParam)
143 {
144 if ( message == m_uTaskbarCreatedMessage )
145 {
146 //Explorerの再起動など。ICONの再設定が必要
147 if ( m_boShow )
148 {
149 m_Modify(m_icondata);
150 }
151 return false;
152 }
153 if ( message != m_icondata.uCallbackMessage )
154 {
155 return false;
156 }
157 //TRACE1("RelayEvent = 0x%08X\n", lParam);
158 switch ( lParam )
159 {
160 case WM_LBUTTONDOWN:
161 case WM_LBUTTONUP:
162 case WM_LBUTTONDBLCLK:
163 case WM_RBUTTONDOWN:
164 case WM_RBUTTONUP:
165 case WM_RBUTTONDBLCLK:
166 break;
167 default:
168 return false;
169 }
170 if ( ! m_syncClick.Lock(0) )
171 {
172 return false;
173 }
174 //
175 bool rc = false;
176 POINT tPoint = { 0x7FFF, 0x7FFF };
177 ::GetCursorPos(&tPoint);
178 ::SetForegroundWindow(m_icondata.hWnd);
179 ::SetFocus(m_icondata.hWnd);
180 if ( m_piListener != NULL )
181 {
182 m_piListener->OnNotifyTasktrayIcon(static_cast<UINT>(lParam), tPoint);
183 }
184 #ifndef _WIN32_WCE
185 if ( lParam == WM_RBUTTONDOWN )
186 {
187 rc = true;
188 }
189 if ( lParam == WM_RBUTTONUP )
190 {
191 rc = !! ShowMenu(tPoint, TPM_LEFTALIGN | TPM_RIGHTBUTTON);
192 }
193 #else
194 if ( lParam == WM_LBUTTONUP )
195 {
196 rc = !! ShowMenu(tPoint, TPM_LEFTALIGN);
197 }
198 #endif
199 m_syncClick.Unlock();
200 return rc;
201 }
202
211 bool Create(HWND hWnd, HICON hIcon, LPCTSTR lpTip = NULL)
212 {
213 m_icondata.hIcon = hIcon;
214 m_icondata.hWnd = hWnd;
215 m_icondata.SetTip(lpTip);
216 m_icondata.ResetFlag();
217 m_Modify(m_icondata);
218 m_boShow = true;
219 return true;
220 }
221
225 void Hide(void)
226 {
227 if ( m_boShow )
228 {
229 ::Shell_NotifyIcon(NIM_DELETE, m_icondata);
230 m_boShow = false;
231 }
232 }
233
239 void SetMenu(int id = 0)
240 {
241 m_idMenu = id;
242 m_hMenu = NULL;
243 }
244
250 void SetMenu(HMENU h = NULL)
251 {
252 m_idMenu = 0;
253 m_hMenu = h;
254 }
255
260 void ModifyIcon(HICON hIcon)
261 {
262 if ( m_boShow )
263 {
264 m_icondata.hIcon = hIcon;
265 m_icondata.ResetFlag();
266 m_Modify(m_icondata);
267 }
268 }
269
274 void ModifyTip(LPCTSTR lpTip)
275 {
276 if ( m_boShow )
277 {
278 m_icondata.SetTip(lpTip);
279 m_icondata.ResetFlag();
280 m_Modify(m_icondata);
281 }
282 }
283
284#if _WIN32_IE >= 0x0500
287 {
288 EII_None = 0x00000000,
289 EII_Info = 0x00000001,
290 EII_Warning = 0x00000002,
291 EII_Error = 0x00000003,
292 EII_NsNone = 0x00000010,
293 EII_NsInfo = 0x00000011,
294 EII_NsWarning = 0x00000012,
295 EII_NsError = 0x00000013,
296 };
297
307 void ShowInformation(EInfoIcon eIcon, LPCTSTR lpszTitle, LPCTSTR lpszMessage, DWORD dwTimeout = 0)
308 {
309 if ( m_boShow )
310 {
311 CStr s;
312 s = lpszTitle;
313 STRLIB::Copy(m_icondata.szInfoTitle, s.Left(sizeof(m_icondata.szInfoTitle) - 1));
314 s = lpszMessage;
315 STRLIB::Copy(m_icondata.szInfo, s.Left(sizeof(m_icondata.szInfo) - 1));
316 m_icondata.dwInfoFlags = eIcon;
317 m_icondata.uTimeout = dwTimeout;
318 //
319 m_icondata.uFlags |= 0x00000010/*NIF_INFO*/;
320 m_Modify(m_icondata);
321 m_icondata.uFlags &= ~0x00000010/*NIF_INFO*/;
322 }
323 }
324
331 {
332 if ( m_boShow )
333 {
334 m_icondata.szInfoTitle[0] = 0;
335 m_icondata.szInfo[0] = 0;
336 m_icondata.dwInfoFlags = EII_None;
337 m_icondata.uTimeout = 0;
338 //
339 m_icondata.uFlags |= 0x00000010/*NIF_INFO*/;
340 m_Modify(m_icondata);
341 m_icondata.uFlags &= ~0x00000010/*NIF_INFO*/;
342 }
343 }
344#endif
345
354 #ifndef _WIN32_WCE
355 DWORD ShowMenu(const POINT& po, UINT flag = TPM_LEFTALIGN | TPM_RIGHTBUTTON)
356 #else
357 DWORD ShowMenu(const POINT& po, UINT flag = TPM_LEFTALIGN)
358 #endif
359 {
360 if ( m_idMenu != 0 )
361 {
362 HINSTANCE hIns = TNB::GetInstanceHandleByTnb();
363 HMENU hMenu = ::LoadMenu(hIns, MAKEINTRESOURCE(m_idMenu));
364 if ( hMenu != NULL )
365 {
366 HMENU h = ::GetSubMenu(hMenu, 0);
367 DWORD r = ::TrackPopupMenuEx(h, flag, po.x, po.y, m_icondata.hWnd, NULL);
368 ::DestroyMenu(h);
369 ::DestroyMenu(hMenu);
370 return r;
371 }
372 }
373 else if ( m_hMenu != NULL )
374 {
375 return ::TrackPopupMenuEx(m_hMenu, flag, po.x, po.y, m_icondata.hWnd, NULL);
376 }
377 return 0;
378 }
379
380private:
381
385 class CIconData
386 {
387 public:
388 DWORD cbSize;
389 HWND hWnd;
390 UINT uID;
391 UINT uFlags;
392 UINT uCallbackMessage;
393 HICON hIcon;
394 #if _WIN32_IE < 0x0500
395 TCHAR szTip[64];
396 #else
397 TCHAR szTip[128];
398 DWORD dwState;
399 DWORD dwStateMask;
400 TCHAR szInfo[256];
401 union {
402 UINT uTimeout;
403 UINT uVersion;
404 } DUMMYUNIONNAME;
405 TCHAR szInfoTitle[64];
406 DWORD dwInfoFlags;
407 #if _WIN32_IE >= 0x0600
408 GUID guidItem;
409 #endif
410 #endif
411 // コンストラクタ
412 CIconData(void)
413 {
414 Zero(*this);
415 cbSize = sizeof(CIconData);
416 }
418 operator NOTIFYICONDATA*(void)
419 {
420 return reinterpret_cast<NOTIFYICONDATA*>(this);
421 }
426 void SetTip(LPCTSTR lpTip)
427 {
428 CStr s = lpTip;
429 STRLIB::Copy(szTip, s.Left(sizeof(szTip) - 1));
430 }
435 void ResetFlag(void)
436 {
437 uFlags = NIF_MESSAGE;
438 if ( szTip[0] != 0 )
439 {
440 uFlags |= NIF_TIP;
441 }
442 if ( hIcon != NULL )
443 {
444 uFlags |= NIF_ICON;
445 }
446 }
447 };
448
452 void m_Modify(NOTIFYICONDATA* P)
453 {
454 if ( m_boShow && ::Shell_NotifyIcon(NIM_MODIFY, P) )
455 {
456 return;
457 }
458 while ( true )
459 {
460 if ( ::Shell_NotifyIcon(NIM_ADD, P) )
461 {
462 break;/*成功*/
463 }
464 if ( _GetLastError("Shell_NotifyIcon") != ERROR_TIMEOUT )
465 {
466 break;/*失敗*/
467 }
468 ::Sleep(500);
469 if ( ::Shell_NotifyIcon(NIM_MODIFY, P) )
470 {
471 break;/*成功*/
472 }
473 }
474 }
475 //
476 CIconData m_icondata;
477 int m_idMenu;
478 HMENU m_hMenu;
479 bool m_boShow;
480 IListener* m_piListener;
481 CSyncCounter m_syncClick;
482 UINT m_uTaskbarCreatedMessage;
483};
484
485
486
487}; // TNB
文字列管理関係のヘッダ
同期処理関係のヘッダ
[ETC] コピー不可能スーパークラス.
Definition: TnbDef.h:599
CStrT Left(size_t iSize) const
[作成] 範囲取得.
Definition: TnbStr.h:801
static CStrT Fmt(const TCHAR *lpszFormat,...)
[作成] 書式付き文字列作成
Definition: TnbStr.h:1206
カウンタ式排他クラス
Definition: TnbSync.h:594
virtual bool Lock(DWORD dwTime=INFINITE) const
[排他] ロック
Definition: TnbSync.h:621
virtual void Unlock(void) const
[排他] アンロック
Definition: TnbSync.h:654
タスクトレイアイコン管理クラス
virtual ~CTasktrayIcon(void)
デストラクタ
void ModifyIcon(HICON hIcon)
[設定] アイコン変更
void ModifyTip(LPCTSTR lpTip)
[設定] チップ内容変更
void SetListener(IListener *piListener)
[登録] リスナー登録
void SetMenu(int id=0)
[設定] メニュー変更(ID指定)
void ShowInformation(EInfoIcon eIcon, LPCTSTR lpszTitle, LPCTSTR lpszMessage, DWORD dwTimeout=0)
[設定] インフォメーション表示
CTasktrayIcon(UINT uID=0)
コンストラクタ
EInfoIcon
インフォメーションアイコン種
@ EII_Info
!マーク
@ EII_NsWarning
警告マーク(音なし)
@ EII_NsError
エラーマーク(音なし)
@ EII_NsNone
アイコンなし(音なし)
@ EII_Warning
警告マーク
@ EII_Error
エラーマーク
@ EII_NsInfo
!マーク(音なし)
@ EII_None
アイコンなし
void HideInformation(void)
[設定] インフォメーション非表示
void SetMenu(HMENU h=NULL)
[設定] メニュー変更(ハンドル指定)
bool Create(HWND hWnd, HICON hIcon, LPCTSTR lpTip=NULL)
[作成] アイコン作成
DWORD ShowMenu(const POINT &po, UINT flag=TPM_LEFTALIGN|TPM_RIGHTBUTTON)
[表示] メニュー表示.
void Hide(void)
[削除] アイコン消去
bool RelayEvent(UINT message, WPARAM wParam, LPARAM lParam)
[処理] イベント中継
void Copy(LPSTR _dst, LPCSTR src)
[複製] 文字列コピー(ASCII/SJIS用)
Definition: TnbStrLib.h:89
void Zero(V &value)
[設定] ゼロクリア.
Definition: TnbDef.h:399
HINSTANCE GetInstanceHandleByTnb(EInstanceType type=EI_Process)
[取得] インスタンスハンドル取得.
Definition: TnbDef.h:1341
TNB Library
Definition: TnbDoxyTitle.txt:2
タスクバーアイコン管理のリスナーインターフェーズ
virtual ~IListener(void)
デストラクタ
virtual void OnNotifyTasktrayIcon(UINT uMsg, const POINT &tPoint)=0
[通知] アイコン操作通知