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

Last change on this file since 100 was 100, checked in by roman, 10 years ago

Added more identifiers: WIA

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