source: trunk/Utilities/ShowHresult/NotifyIconWindow.h @ 101

Last change on this file since 101 was 101, checked in by roman, 10 years ago
  • Property svn:keywords set to Id
File size: 18.1 KB
Line 
1////////////////////////////////////////////////////////////
2// Copyright (C) Roman Ryltsov, 2008-2011
3// Created by Roman Ryltsov roman@alax.info
4//
5// $Id: NotifyIconWindow.h 101 2012-08-23 18:20:02Z roman $
6
7#pragma once
8
9#include <vfwmsgs.h>
10#include <asferr.h> // FACILITY_NS
11#include <mferror.h> // FACILITY_MF
12#include <wmcodecdsp.h> // FACILITY_WMAAECMA
13#include <ddraw.h> // _FACD3D
14//#include <d3d9helper.h> // _FACD3D
15#include <d3d9.h> // _FACD3D
16#include <d2derr.h> // FACILITY_D2D
17#include <wincodec.h> // FACILITY_WINCODEC_ERR
18#include <wia_lh.h> // FACILITY_WIA
19#include <corerror.h> // FACILITY_URT
20#include "rowinhttp.h"
21#include "AboutDialog.h"
22
23////////////////////////////////////////////////////////////
24// CNotifyIconWindow
25
26class CNotifyIconWindow : 
27        public CMessageOnlyWindowImpl<CNotifyIconWindow>
28{
29public:
30
31DECLARE_WND_CLASS(_T("CNotifyIconWindow"))
32
33BEGIN_MSG_MAP_EX(CNotifyIconWindow)
34        _Z4(atlTraceUI, 4, _T("uMsg 0x%04X, wParam 0x%08X, lParam 0x%08X\n"), uMsg, wParam, lParam);
35        //CHAIN_MSG_MAP(CMessageOnlyWindowImpl<CNotifyIconWindow>)
36        MSG_WM_CREATE(OnCreate)
37        MSG_WM_DESTROY(OnDestroy)
38        MSG_WM_CHANGECBCHAIN(OnChangeCbChain)
39        MSG_WM_DRAWCLIPBOARD(OnDrawClipboard)
40        MSG_WM_MOUSEMOVE(OnMouseMove)
41        MSG_WM_LBUTTONDBLCLK(OnLButtonDblClk)
42        MSG_WM_RBUTTONUP(OnRButtonUp)
43        MESSAGE_HANDLER_EX(NIN_BALLOONUSERCLICK, OnNotifyIconBalloonUserClick)
44        MESSAGE_HANDLER_EX(WM_NOTIFYICON, OnNotifyIcon)
45        COMMAND_ID_HANDLER_EX(ID_APP_ABOUT, OnApplicationAbout)
46        COMMAND_ID_HANDLER_EX(ID_APP_EXIT, OnApplicationExit)
47        REFLECT_NOTIFICATIONS()
48END_MSG_MAP()
49
50public:
51
52        //////////////////////////////////////////////////////////
53        // Window Message Identifiers
54
55        enum
56        {
57                WM_FIRST = WM_APP,
58                WM_NOTIFYICON,
59        };
60
61private:
62        ULONGLONG m_nCommonControlsVersion;
63        ULONGLONG m_nShellVersion;
64        NOTIFYICONDATA m_NotifyIconData;
65        CWindow m_NextClipboardViewerWindow;
66        CString m_sQuery;
67
68        static BOOL IsQuartzResult(HRESULT nResult, CString* psMessage = NULL)
69        {
70                if(HRESULT_FACILITY(nResult) != FACILITY_ITF)
71                        return FALSE;
72                const SCODE nCode = HRESULT_CODE(nResult);
73                if(nCode < 0x0200)// && nCode <= 0xFFFF)
74                        return FALSE;
75                const CString sMessage = AtlFormatSystemMessage(CDataLibraryMap::LoadLibrary(_T("quartz.dll")), nResult);
76                if(sMessage.IsEmpty())
77                        return FALSE;
78                if(psMessage)
79                        *psMessage = sMessage;
80                return TRUE;
81        }
82        static CString LookupQuartzIdentifier(HRESULT nValue)
83        {
84                static const struct { HRESULT nValue; LPCSTR pszName; } g_pMap[] = 
85                {
86                        #define A(x) { x, #x },
87                        #include "DsIdentifier.inc"
88                        #undef A
89                };
90                for(SIZE_T nIndex = 0; nIndex < DIM(g_pMap); nIndex++)
91                        if(g_pMap[nIndex].nValue == nValue)
92                                return CString(g_pMap[nIndex].pszName);
93                return _T("");
94        }
95        static BOOL IsWmResult(HRESULT nResult, CString* psMessage = NULL)
96        {
97                if(HRESULT_FACILITY(nResult) != FACILITY_NS)
98                        return FALSE;
99                // SUGG: Cache loaded libraries
100                HMODULE hModule = NULL;
101                const SCODE nCode = HRESULT_CODE(nResult);
102                CString sMessage;
103                if(nCode >= 2000 && nCode < 3000) // 2000 -  2999 = ASF (defined in ASFERR.MC)
104                        sMessage = AtlFormatSystemMessage(CDataLibraryMap::LoadLibrary(_T("asferror.dll")), nResult);
105                else
106                        sMessage = AtlFormatSystemMessage(CDataLibraryMap::LoadLibrary(_T("wmerror.dll")), nResult);
107                if(sMessage.IsEmpty())
108                        return FALSE;
109                if(psMessage)
110                        *psMessage = sMessage;
111                return TRUE;
112        }
113        static BOOL IsMfResult(HRESULT nResult, CString* psMessage = NULL)
114        {
115                if(HRESULT_FACILITY(nResult) != FACILITY_MF)
116                        return FALSE;
117                const CString sMessage = AtlFormatSystemMessage(CDataLibraryMap::LoadLibrary(_T("mferror.dll")), nResult);
118                if(sMessage.IsEmpty())
119                        return FALSE;
120                if(psMessage)
121                        *psMessage = sMessage;
122                return TRUE;
123        }
124        static CString LookupMfIdentifier(HRESULT nValue)
125        {
126                static const struct { HRESULT nValue; LPCSTR pszName; } g_pMap[] = 
127                {
128                        #define A(x) { x, #x },
129                        #include "MfIdentifier.inc"
130                        #undef A
131                };
132                for(SIZE_T nIndex = 0; nIndex < DIM(g_pMap); nIndex++)
133                        if(g_pMap[nIndex].nValue == nValue)
134                                return CString(g_pMap[nIndex].pszName);
135                return _T("");
136        }
137        static BOOL IsWs2Result(HRESULT nResult, CString* psMessage = NULL)
138        {
139                if(HRESULT_FACILITY(nResult) != FACILITY_WIN32)
140                        return FALSE;
141                const SCODE nCode = HRESULT_CODE(nResult);
142                if(nCode < 10000 || nCode >= 11150) // WSABASEERR, ...
143                        return FALSE;
144                const CString sMessage = AtlFormatSystemMessage(CDataLibraryMap::LoadLibrary(_T("ws2_32.dll")), nResult);
145                if(sMessage.IsEmpty())
146                        return FALSE;
147                if(psMessage)
148                        *psMessage = sMessage;
149                return TRUE;
150        }
151        static BOOL IsWinHttpResult(HRESULT nResult, CString* psMessage = NULL)
152        {
153                if(HRESULT_FACILITY(nResult) != FACILITY_WIN32)
154                        return FALSE;
155                const LONG nCode = HRESULT_CODE(nResult);
156                if(nCode < 12000 || nCode >= 12200) // WINHTTP_ERROR_BASE, WINHTTP_ERROR_LAST
157                        return FALSE;
158                const CString sMessage = AtlFormatSystemMessage(CDataLibraryMap::LoadLibrary(_T("winhttp.dll")), nResult);
159                if(sMessage.IsEmpty())
160                        return FALSE;
161                if(psMessage)
162                        *psMessage = sMessage;
163                return TRUE;
164        }
165        static BOOL IsWinInetResult(HRESULT nResult, CString* psMessage = NULL)
166        {
167                if(HRESULT_FACILITY(nResult) != FACILITY_WIN32)
168                        return FALSE;
169                const LONG nCode = HRESULT_CODE(nResult);
170                if(nCode < 12000 || nCode >= 12200) // INTERNET_ERROR_BASE, INTERNET_ERROR_LAST
171                        return FALSE;
172                const CString sMessage = AtlFormatSystemMessage(CDataLibraryMap::LoadLibrary(_T("wininet.dll")), nResult);
173                if(sMessage.IsEmpty())
174                        return FALSE;
175                if(psMessage)
176                        *psMessage = sMessage;
177                return TRUE;
178        }
179        static CString LookupSystemIdentifier(HRESULT nValue)
180        {
181                if(HRESULT_SEVERITY(nValue) == SEVERITY_ERROR && HRESULT_FACILITY(nValue) == FACILITY_WIN32)
182                        nValue = HRESULT_CODE(nValue);
183                if(nValue < 0 || nValue >= 16384)
184                        return _T("");
185                static const struct { HRESULT nValue; LPCSTR pszName; } g_pMap[] = 
186                {
187                        #define A(x) { x, #x },
188                        #include "SystemIdentifier.inc"
189                        #undef A
190                };
191                for(SIZE_T nIndex = 0; nIndex < DIM(g_pMap); nIndex++)
192                        if(g_pMap[nIndex].nValue == nValue)
193                                return CString(g_pMap[nIndex].pszName);
194                return _T("");
195        }
196        static BOOL IsD3dResult(HRESULT nResult, CString* psMessage = NULL)
197        {
198                if(HRESULT_FACILITY(nResult) != _FACD3D)
199                        return FALSE;
200                psMessage;
201                return !LookupD3dIdentifier(nResult).IsEmpty();
202        }
203        static CString LookupD3dIdentifier(HRESULT nValue)
204        {
205                static const struct { HRESULT nValue; LPCSTR pszName; } g_pMap[] = 
206                {
207                        #define A(x) { x, #x },
208                        #include "D3dIdentifier.inc"
209                        #undef A
210                };
211                for(SIZE_T nIndex = 0; nIndex < DIM(g_pMap); nIndex++)
212                        if(g_pMap[nIndex].nValue == nValue)
213                                return CString(g_pMap[nIndex].pszName);
214                return _T("");
215        }
216        static BOOL IsD2dResult(HRESULT nResult, CString* psMessage = NULL)
217        {
218                if(HRESULT_FACILITY(nResult) != FACILITY_D2D)
219                        return FALSE;
220                psMessage;
221                return !LookupD2dIdentifier(nResult).IsEmpty();
222        }
223        static CString LookupD2dIdentifier(HRESULT nValue)
224        {
225                static const struct { HRESULT nValue; LPCSTR pszName; } g_pMap[] = 
226                {
227                        #define A(x) { x, #x },
228                        #include "D2dIdentifier.inc"
229                        #undef A
230                };
231                for(SIZE_T nIndex = 0; nIndex < DIM(g_pMap); nIndex++)
232                        if(g_pMap[nIndex].nValue == nValue)
233                                return CString(g_pMap[nIndex].pszName);
234                return _T("");
235        }
236        static BOOL IsWicResult(HRESULT nResult, CString* psMessage = NULL)
237        {
238                if(HRESULT_FACILITY(nResult) != FACILITY_WINCODEC_ERR)
239                        return FALSE;
240                psMessage;
241                return !LookupWicIdentifier(nResult).IsEmpty();
242        }
243        static CString LookupWicIdentifier(HRESULT nValue)
244        {
245                static const struct { HRESULT nValue; LPCSTR pszName; } g_pMap[] = 
246                {
247                        #define A(x) { x, #x },
248                        #include "WicIdentifier.inc"
249                        #undef A
250                };
251                for(SIZE_T nIndex = 0; nIndex < DIM(g_pMap); nIndex++)
252                        if(g_pMap[nIndex].nValue == nValue)
253                                return CString(g_pMap[nIndex].pszName);
254                return _T("");
255        }
256        static BOOL IsWiaResult(HRESULT nResult, CString* psMessage = NULL)
257        {
258                if(HRESULT_FACILITY(nResult) != FACILITY_WIA)
259                        return FALSE;
260                psMessage;
261                return !LookupWiaIdentifier(nResult).IsEmpty();
262        }
263        static CString LookupWiaIdentifier(HRESULT nValue)
264        {
265                static const struct { HRESULT nValue; LPCSTR pszName; } g_pMap[] = 
266                {
267                        #define A(x) { x, #x },
268                        #include "WiaIdentifier.inc"
269                        #undef A
270                };
271                for(SIZE_T nIndex = 0; nIndex < DIM(g_pMap); nIndex++)
272                        if(g_pMap[nIndex].nValue == nValue)
273                                return CString(g_pMap[nIndex].pszName);
274                return _T("");
275        }
276        static BOOL IsUrtResult(HRESULT nResult, CString* psMessage = NULL)
277        {
278                if(HRESULT_FACILITY(nResult) != FACILITY_URT)
279                        return FALSE;
280                psMessage;
281                return !LookupUrtIdentifier(nResult).IsEmpty();
282        }
283        static CString LookupUrtIdentifier(HRESULT nValue)
284        {
285                static const struct { HRESULT nValue; LPCSTR pszName; } g_pMap[] = 
286                {
287                        #define A(x) { x, #x },
288                        #include "UrtIdentifier.inc"
289                        #undef A
290                };
291                for(SIZE_T nIndex = 0; nIndex < DIM(g_pMap); nIndex++)
292                        if(g_pMap[nIndex].nValue == nValue)
293                                return CString(g_pMap[nIndex].pszName);
294                return _T("");
295        }
296
297public:
298// CNotifyIconWindow
299        static ULONGLONG GetCommonControlsVersion() throw()
300        {
301                DWORD nMajorVersion, nMinorVersion;
302                _W(SUCCEEDED(AtlGetCommCtrlVersion(&nMajorVersion, &nMinorVersion)));
303                return (ULONGLONG) ((nMajorVersion << 16) + nMinorVersion) << 32;
304        }
305        static ULONGLONG GetShellVersion() throw()
306        {
307                DWORD nMajorVersion, nMinorVersion;
308                _W(SUCCEEDED(AtlGetShellVersion(&nMajorVersion, &nMinorVersion)));
309                return (ULONGLONG) ((nMajorVersion << 16) + nMinorVersion) << 32;
310        }
311        CNotifyIconWindow()
312        {
313        }
314        HWND Create()
315        {
316                return __super::Create(NULL, rcDefault, _T("AlaxInfo.ShowHresult.NotifyIconWindow"));
317        }
318        static CString GetDefaultInfoTitle()
319        {
320                return AtlLoadString(IDS_NOTIFYICON_DEFAULTTIPTITLE);
321        }
322        static DWORD GetDefaultInfoFlags() throw()
323        {
324                return NIIF_NONE;
325        }
326        VOID SetBalloonToolTip(DWORD nFlags, LPCTSTR pszTitle, LPCTSTR pszText, UINT nTimeout = 30 * 1000)
327        {
328                if(IsWindow() && m_NotifyIconData.uFlags & NIF_INFO)
329                {
330                        m_NotifyIconData.uTimeout = nTimeout;
331                        m_NotifyIconData.dwInfoFlags = nFlags;
332                        _tcsncpy_s(m_NotifyIconData.szInfoTitle, pszTitle, _TRUNCATE);
333                        _tcsncpy_s(m_NotifyIconData.szInfo, pszText, _TRUNCATE);
334                        _W(Shell_NotifyIcon(NIM_MODIFY, &m_NotifyIconData));
335                }
336        }
337        BOOL Process(LPCTSTR pszText)
338        {
339                #pragma region Parse
340                if(_tcslen(pszText) > 24)
341                        return FALSE;
342                CString sText = pszText;
343                sText.Trim();
344                if(!sText.IsEmpty() && _tcschr(_T("Ll"), sText[sText.GetLength() - 1]))
345                        sText.Delete(sText.GetLength() - 1);
346                if(sText.IsEmpty())
347                        return FALSE;
348                LONGLONG nLongLongResult;
349                if(_tcsnicmp(sText, _T("0x"), 2) == 0)
350                {
351                        SIZE_T nIndex = 2;
352                        for(; nIndex < (SIZE_T) sText.GetLength(); nIndex++)
353                                if(!_tcschr(_T("0123456789ABCDEFabcdef"), sText[nIndex]))
354                                        return FALSE;
355                        if(!StrToInt64Ex(sText, STIF_SUPPORT_HEX, &nLongLongResult))
356                                return FALSE; 
357                } else
358                {
359                        SIZE_T nIndex = 0;
360                        if(sText[0] == _T('-'))
361                                nIndex++;
362                        for(; nIndex < (SIZE_T) sText.GetLength(); nIndex++)
363                                if(!_tcschr(_T("0123456789"), sText[nIndex]))
364                                        return FALSE;
365                        nLongLongResult = _ttoi64(sText);
366                }
367                const LONG nHighLongLongResult = (LONG) (nLongLongResult >> 32);
368                if(!nLongLongResult || nHighLongLongResult > 0 || nHighLongLongResult < -1)
369                        return FALSE;
370                HRESULT nResult = (LONG) nLongLongResult;
371                #pragma endregion
372                #pragma region Lookup
373                // NOTE: Include file regular expression replacement: ^.+?\#define +([^ ]+?) +MAKE_D3D.+\r?$ -> A($1)
374                CString sTitle, sMessage, sIdentifier;
375                if(IsQuartzResult(nResult, &sMessage))
376                {
377                        sTitle = _T("DirectShow");
378                        sIdentifier = LookupQuartzIdentifier(nResult);
379                } else if(IsWmResult(nResult, &sMessage))
380                        sTitle = _T("Windows Media");
381                else if(IsMfResult(nResult, &sMessage))
382                {
383                        sTitle = _T("Media Foundation");
384                        sIdentifier = LookupMfIdentifier(nResult);
385                } else if(IsWs2Result(nResult, &sMessage))
386                        sTitle = _T("Sockets");
387                else if(IsWinHttpResult(nResult, &sMessage))
388                        sTitle = _T("WinHTTP");
389                else if(IsWinInetResult(nResult, &sMessage))
390                        sTitle = _T("WinInet");
391                else if(IsD3dResult(nResult, &sMessage))
392                {
393                        sTitle = _T("DirectDraw/Direct3D");
394                        sIdentifier = LookupD3dIdentifier(nResult);
395                } else if(IsD2dResult(nResult, &sMessage))
396                {
397                        sTitle = _T("Direct2D");
398                        sIdentifier = LookupD2dIdentifier(nResult);
399                } else if(IsWicResult(nResult, &sMessage))
400                {
401                        sTitle = _T("WinCodec");
402                        sIdentifier = LookupWicIdentifier(nResult);
403                } else if(IsWiaResult(nResult, &sMessage))
404                {
405                        sTitle = _T("WIA");
406                        sIdentifier = LookupWiaIdentifier(nResult);
407                } else if(IsUrtResult(nResult, &sMessage))
408                {
409                        sTitle = _T(".NET");
410                        sIdentifier = LookupUrtIdentifier(nResult);
411                } else 
412                {
413                        sMessage = AtlFormatSystemMessage(nResult);
414                        sIdentifier = LookupSystemIdentifier(nResult);
415                        if(sIdentifier.IsEmpty())
416                                sIdentifier = LookupHresultSystemIdentifier(nResult);
417                        if(!sMessage.IsEmpty() || !sIdentifier.IsEmpty())
418                                sTitle = _T("System");
419                }
420                if(sMessage.IsEmpty() && sTitle.IsEmpty())
421                        return FALSE;
422                #pragma endregion
423                #pragma region Present
424                _A(!sTitle.IsEmpty());
425                m_sQuery = AtlFormatString(_T("0x%08X"), nResult) + _T(" ") + sIdentifier + _T(" ") + sMessage;
426                CRoArrayT<CString> TitleArray;
427                _W(TitleArray.Add(AtlFormatString(_T("0x%08X"), nResult)) >= 0);
428                if(!sIdentifier.IsEmpty())
429                        _W(TitleArray.Add(sIdentifier) >= 0);
430                if(!sTitle.IsEmpty())
431                        _W(TitleArray.Add(sTitle) >= 0);
432                if(sMessage.IsEmpty())
433                        sMessage = _T("(no message found)");
434                SetBalloonToolTip(NIIF_INFO, _StringHelper::Join(TitleArray, _T(" - ")), sMessage);
435                #pragma endregion
436                return TRUE;
437        }
438
439// Window message handelrs
440        LRESULT OnCreate(CREATESTRUCT*)
441        {
442                m_nCommonControlsVersion = GetCommonControlsVersion();
443                m_nShellVersion = GetShellVersion();
444                SetIcon(AtlLoadIconImage(IDI_MODULE, LR_DEFAULTCOLOR, GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON)), TRUE);
445                SetIcon(AtlLoadIconImage(IDI_MODULE, LR_DEFAULTCOLOR, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON)), FALSE);
446                CIcon Icon = AtlLoadIconImage(IDI_MODULE, LR_DEFAULTCOLOR, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON));
447                CString sTip = AtlLoadString(IDS_PROJNAME);
448                ZeroMemory(&m_NotifyIconData, sizeof m_NotifyIconData);
449                m_NotifyIconData.hWnd = m_hWnd;
450                m_NotifyIconData.uID = 1;
451                m_NotifyIconData.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP | NIF_STATE;
452                m_NotifyIconData.uCallbackMessage = WM_NOTIFYICON;
453                m_NotifyIconData.hIcon = Icon;
454                _tcsncpy_s(m_NotifyIconData.szTip, sTip,  _TRUNCATE);
455                if(m_nShellVersion >= 0x0005000000000000) // 5.0
456                {
457                        m_NotifyIconData.cbSize = sizeof m_NotifyIconData; 
458                        m_NotifyIconData.uFlags |= NIF_INFO;
459                        _tcsncpy_s(m_NotifyIconData.szInfoTitle, GetDefaultInfoTitle(), _TRUNCATE);
460                        m_NotifyIconData.dwInfoFlags = GetDefaultInfoFlags();
461                } else
462                        m_NotifyIconData.cbSize = NOTIFYICONDATA_V1_SIZE; 
463                _W(Shell_NotifyIcon(NIM_ADD, &m_NotifyIconData));
464                m_NotifyIconData.uFlags &= ~(NIF_ICON | NIF_STATE);
465                m_NextClipboardViewerWindow = SetClipboardViewer();
466                _pAtlModule->Lock();
467                #if defined(_DEBUG)
468                //Process(AtlFormatString(_T("%d"), 0x80040227)); // VFW_E_WRONG_STATE
469                Process(_T("0xC00D36B9")); // MF_E_NO_MORE_TYPES)
470                //Process(AtlFormatString(_T("0x%x"), HRESULT_FROM_WIN32(WSAEADDRINUSE))); // WSAEADDRINUSE
471                //Process(AtlFormatString(_T("0x%x"), HRESULT_FROM_WIN32(ERROR_WINHTTP_AUTODETECTION_FAILED))); // ERROR_WINHTTP_AUTODETECTION_FAILED
472                Process(_T("0x80290208L"));
473                #endif // defined(_DEBUG)
474                return TRUE;
475        }
476        LRESULT OnDestroy() throw()
477        {
478                _pAtlModule->Unlock();
479                _W(ChangeClipboardChain(m_NextClipboardViewerWindow));
480                _W(Shell_NotifyIcon(NIM_DELETE, &m_NotifyIconData));
481                m_NotifyIconData.hWnd = NULL;
482                return 0;
483        }
484        LRESULT OnChangeCbChain(CWindow RemovedWindow, CWindow NextWindow)
485        {
486                if(m_NextClipboardViewerWindow == RemovedWindow)
487                        m_NextClipboardViewerWindow = NextWindow;
488                else if(m_NextClipboardViewerWindow)
489                        m_NextClipboardViewerWindow.SendMessage(WM_CHANGECBCHAIN, (WPARAM) (HWND) RemovedWindow, (LPARAM) (HWND) NextWindow);
490                return 0;
491        }
492        LRESULT OnDrawClipboard()
493        {
494                if(OpenClipboard()) 
495                {
496                        _ATLTRY
497                        {
498                                if(IsClipboardFormatAvailable(CF_UNICODETEXT))
499                                {
500                                        CGlobalMemoryWeakHandle DataHandle = (HGLOBAL) GetClipboardData(CF_UNICODETEXT);
501                                        __E(DataHandle);
502                                        CGlobalMemoryHandle::CLockT<WCHAR> pszData(DataHandle);
503                                        Process(CW2CT(pszData));
504                                }
505                        }
506                        _ATLCATCHALL()
507                        {
508                                _W(CloseClipboard());
509                                _ATLRETHROW;
510                        }
511                        _W(CloseClipboard());
512                }
513                return 0;
514        }
515        LRESULT OnMouseMove(UINT, CPoint)
516        {
517                return 0;
518        }
519        LRESULT OnLButtonDblClk(UINT, CPoint)
520        {
521                if(!IsWindowEnabled())
522                        return 0;
523                INT nDefaultCommandIdentifier = ID_APP_ABOUT;
524                //CWaitCursor WaitCursor;
525                if(nDefaultCommandIdentifier)
526                        _W(PostMessage(WM_COMMAND, nDefaultCommandIdentifier));
527                return 0;
528        }
529        LRESULT OnRButtonUp(UINT, CPoint)
530        {
531                CMenu ContainerMenu;
532                _W(ContainerMenu.LoadMenu(IDR_NOTIFYICON));
533                CMenuHandle Menu;
534                INT nDefaultCommandIdentifier = ID_APP_ABOUT;
535                Menu = ContainerMenu.GetSubMenu(0);
536                //CWaitCursor WaitCursor;
537                _A(Menu);
538                if(nDefaultCommandIdentifier)
539                        _W(Menu.SetMenuDefaultItem(nDefaultCommandIdentifier));
540                CPoint Position;
541                GetCursorPos(&Position);
542                _W(SetForegroundWindow(m_hWnd));
543                _W(Menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_TOPALIGN | TPM_VERTICAL, Position.x, Position.y, m_hWnd));
544                return 0;
545        }
546        LRESULT OnNotifyIconBalloonUserClick(UINT, WPARAM, LPARAM)
547        {
548                if(m_sQuery.IsEmpty())
549                        return 0;
550                CWinHttpRequestIdentifier Identifier(_T("http://google.com/search"));
551                Identifier.AddSearchValue(_T("q"), m_sQuery);
552                CWaitCursor WaitCursor;
553                ShellExecute(m_hWnd, NULL, CW2CT(Identifier.GetValue()), NULL, NULL, SW_SHOWDEFAULT);
554                return 0;
555        }
556        LRESULT OnNotifyIcon(UINT uMsg, WPARAM wParam, LPARAM lParam) throw()
557        {
558                _A(wParam == m_NotifyIconData.uID);
559                return SendMessage((UINT) lParam);
560        }
561        LRESULT OnApplicationAbout(UINT, INT, HWND) throw()
562        {
563                CAboutDialog Dialog;
564                EnableWindow(FALSE);
565                Dialog.DoModal();
566                EnableWindow(TRUE);
567                return 0;
568        }
569        LRESULT OnApplicationExit(UINT = 0, INT = ID_APP_EXIT, HWND = NULL) throw()
570        {
571                PostQuitMessage(0);
572                return 0;
573        }
574};
Note: See TracBrowser for help on using the repository browser.