1
/////////////////////////////////////////////////////////////////////////
3
// Purpose: Implements wxTaskBarIconEx class for manipulating icons on
4
// the Windows task bar.
5
// Author: Julian Smart
8
// RCS-ID: $Id: taskbarex.cpp 15453 2008-06-23 18:48:59Z romw $
10
// Licence: wxWindows licence
11
/////////////////////////////////////////////////////////////////////////
14
#pragma implementation "taskbarex.h"
18
#include "BOINCGUIApp.h"
19
#include "msw/taskbarex.h"
20
#include "BOINCTaskBar.h"
23
LRESULT APIENTRY wxTaskBarIconExWindowProc( HWND hWnd, unsigned msg, UINT wParam, LONG lParam );
25
wxChar* wxTaskBarExWindowClass = (wxChar*) wxT("wxTaskBarExWindowClass");
26
wxChar* wxTaskBarExWindow = (wxChar*) wxT("wxTaskBarExWindow");
28
const UINT WM_TASKBARCREATED = ::RegisterWindowMessage(wxT("TaskbarCreated"));
29
const UINT WM_TASKBARSHUTDOWN = ::RegisterWindowMessage(wxT("TaskbarShutdown"));
31
bool wxTaskBarIconEx::sm_registeredClass = FALSE;
32
UINT wxTaskBarIconEx::sm_taskbarMsg = 0;
34
DEFINE_EVENT_TYPE( wxEVT_TASKBAR_CREATED )
35
DEFINE_EVENT_TYPE( wxEVT_TASKBAR_CONTEXT_MENU )
36
DEFINE_EVENT_TYPE( wxEVT_TASKBAR_SELECT )
37
DEFINE_EVENT_TYPE( wxEVT_TASKBAR_KEY_SELECT )
38
DEFINE_EVENT_TYPE( wxEVT_TASKBAR_BALLOON_SHOW )
39
DEFINE_EVENT_TYPE( wxEVT_TASKBAR_BALLOON_HIDE )
40
DEFINE_EVENT_TYPE( wxEVT_TASKBAR_BALLOON_TIMEOUT )
41
DEFINE_EVENT_TYPE( wxEVT_TASKBAR_BALLOON_USERCLICK )
42
DEFINE_EVENT_TYPE( wxEVT_TASKBAR_SHUTDOWN )
44
IMPLEMENT_DYNAMIC_CLASS(wxTaskBarIconEx, wxEvtHandler)
46
BEGIN_EVENT_TABLE (wxTaskBarIconEx, wxEvtHandler)
47
EVT_CLOSE(wxTaskBarIconEx::OnClose)
48
EVT_TASKBAR_CREATED(wxTaskBarIconEx::OnTaskBarCreated)
52
wxTaskBarIconEx::wxTaskBarIconEx(void)
57
if (RegisterWindowClass())
58
m_hWnd = CreateTaskBarWindow( wxTaskBarExWindow );
61
wxTaskBarIconEx::wxTaskBarIconEx( wxChar* szWindowTitle )
66
if (RegisterWindowClass())
67
m_hWnd = CreateTaskBarWindow( szWindowTitle );
70
wxTaskBarIconEx::~wxTaskBarIconEx(void)
79
::DestroyWindow((HWND) m_hWnd);
85
void wxTaskBarIconEx::OnClose(wxCloseEvent& WXUNUSED(event))
87
wxLogTrace(wxT("Function Start/End"), wxT("wxTaskBarIconEx::OnClose - Function Begin"));
89
::DestroyWindow((HWND) m_hWnd);
92
wxLogTrace(wxT("Function Start/End"), wxT("wxTaskBarIconEx::OnClose - Function End"));
95
void wxTaskBarIconEx::OnTaskBarCreated(wxTaskBarIconExEvent& WXUNUSED(event))
102
bool wxTaskBarIconEx::SetIcon(const wxIcon& icon)
107
memset(¬ifyData, 0, sizeof(notifyData));
108
notifyData.cbSize = sizeof(notifyData);
109
notifyData.hWnd = (HWND) m_hWnd;
111
notifyData.uCallbackMessage = sm_taskbarMsg;
112
notifyData.uFlags = NIF_MESSAGE;
113
notifyData.uVersion = NOTIFYICON_VERSION;
117
notifyData.uFlags |= NIF_ICON;
118
notifyData.hIcon = (HICON) icon.GetHICON();
126
bool wxTaskBarIconEx::SetTooltip(const wxString& message)
131
memset(¬ifyData, 0, sizeof(notifyData));
132
notifyData.cbSize = sizeof(notifyData);
133
notifyData.hWnd = (HWND) m_hWnd;
135
notifyData.uCallbackMessage = sm_taskbarMsg;
136
notifyData.uFlags = NIF_MESSAGE;
137
notifyData.uVersion = NOTIFYICON_VERSION;
139
if (((const wxChar*) message != NULL) && (message != wxT("")))
141
notifyData.uFlags |= NIF_TIP ;
142
lstrcpyn(notifyData.szTip, WXSTRINGCAST message, sizeof(notifyData.szTip));
150
bool wxTaskBarIconEx::SetBalloon(const wxIcon& icon, const wxString title, const wxString message, unsigned int timeout, unsigned int iconballoon)
155
wxString strTip = wxEmptyString;
157
if (!IsBalloonsSupported())
158
strTip = title + wxT(" - ") + message;
160
memset(¬ifyData, 0, sizeof(notifyData));
161
notifyData.cbSize = sizeof(notifyData);
162
notifyData.hWnd = (HWND) m_hWnd;
164
notifyData.uCallbackMessage = sm_taskbarMsg;
165
notifyData.uFlags = NIF_MESSAGE;
166
notifyData.dwInfoFlags = iconballoon | NIIF_NOSOUND;
167
notifyData.uTimeout = timeout;
168
notifyData.uVersion = NOTIFYICON_VERSION;
172
notifyData.uFlags |= NIF_ICON;
173
notifyData.hIcon = (HICON) icon.GetHICON();
176
if (IsBalloonsSupported())
178
notifyData.uFlags |= NIF_INFO | NIF_TIP;
179
lstrcpyn(notifyData.szInfo, WXSTRINGCAST message, sizeof(notifyData.szInfo));
180
lstrcpyn(notifyData.szInfoTitle, WXSTRINGCAST title, sizeof(notifyData.szInfoTitle));
181
lstrcpyn(notifyData.szTip, WXSTRINGCAST wxEmptyString, sizeof(notifyData.szTip));
185
notifyData.uFlags |= NIF_TIP;
186
lstrcpyn(notifyData.szTip, WXSTRINGCAST strTip, sizeof(notifyData.szTip));
193
bool wxTaskBarIconEx::RemoveIcon()
198
memset(¬ifyData, 0, sizeof(notifyData));
199
notifyData.cbSize = sizeof(notifyData);
200
notifyData.hWnd = (HWND) m_hWnd;
201
notifyData.uCallbackMessage = sm_taskbarMsg;
202
notifyData.uFlags = NIF_MESSAGE;
203
notifyData.hIcon = 0 ; // hIcon;
207
return (Shell_NotifyIcon(NIM_DELETE, & notifyData) != 0);
210
void wxTaskBarIconEx::UpdateIcon()
214
Shell_NotifyIcon(NIM_MODIFY, ¬ifyData);
218
m_iconAdded = (Shell_NotifyIcon(NIM_ADD, ¬ifyData) != 0);
219
if (IsBalloonsSupported())
221
Shell_NotifyIcon(NIM_SETVERSION, ¬ifyData);
226
bool wxTaskBarIconEx::PopupMenu(wxMenu *menu) //, int x, int y);
228
// OK, so I know this isn't thread-friendly, but
229
// what to do? We need this check.
231
static bool s_inPopup = FALSE;
241
wxGetMousePosition(&x, &y);
243
// is wxFrame the best window type to use???
244
win = new wxFrame(NULL, -1, wxEmptyString, wxPoint(x,y), wxSize(-1,-1), 0);
245
win->PushEventHandler(this);
247
// Remove from record of top-level windows, or will confuse wxWindows
248
// if we try to exit right now.
249
wxTopLevelWindows.DeleteObject(win);
253
// Work around a WIN32 bug
254
::SetForegroundWindow ((HWND) win->GetHWND ());
256
rval = win->PopupMenu(menu, 0, 0);
258
// Work around a WIN32 bug
259
::PostMessage ((HWND) win->GetHWND(),WM_NULL,0,0L);
261
win->PopEventHandler(FALSE);
271
bool wxTaskBarIconEx::RegisterWindowClass()
273
if (sm_registeredClass)
276
// Also register the taskbar message here
277
sm_taskbarMsg = ::RegisterWindowMessage(wxT("wxTaskBarIconExMessage"));
282
HINSTANCE hInstance = GetModuleHandle(NULL);
285
* set up and register window class
287
wc.style = CS_HREDRAW | CS_VREDRAW;
288
wc.lpfnWndProc = (WNDPROC) wxTaskBarIconExWindowProc;
291
wc.hInstance = hInstance;
294
wc.hbrBackground = 0;
295
wc.lpszMenuName = NULL;
296
wc.lpszClassName = wxTaskBarExWindowClass ;
297
rc = (::RegisterClass( &wc ) != 0);
299
sm_registeredClass = (rc != 0);
304
WXHWND wxTaskBarIconEx::CreateTaskBarWindow( wxChar* szWindowTitle )
306
HINSTANCE hInstance = GetModuleHandle(NULL);
308
HWND hWnd = CreateWindowEx (0, wxTaskBarExWindowClass,
320
return (WXHWND) hWnd;
323
bool wxTaskBarIconEx::IsBalloonsSupported()
326
wxInt32 iMajor = 0, iMinor = 0;
327
if ( wxWINDOWS_NT == wxGetOsVersion( &iMajor, &iMinor ) )
329
if ( (5 >= iMajor) && (0 <= iMinor) )
336
long wxTaskBarIconEx::WindowProc( WXHWND hWnd, unsigned int msg, unsigned int wParam, long lParam )
338
wxLogTrace(wxT("Function Start/End"), wxT("wxTaskBarIconEx::WindowProc - Function Begin"));
340
wxEventType eventType = 0;
341
long lReturnValue = 0;
343
if ( WM_CLOSE == msg )
345
wxLogTrace(wxT("Function Status"), wxT("wxTaskBarIconEx::WindowProc - WM_CLOSE Detected"));
347
wxCloseEvent eventClose(wxEVT_CLOSE_WINDOW);
348
ProcessEvent(eventClose);
350
if ( !eventClose.GetSkipped() )
351
lReturnValue = DefWindowProc((HWND) hWnd, msg, wParam, lParam);
355
else if ( WM_TASKBARCREATED == msg )
357
wxLogTrace(wxT("Function Status"), wxT("wxTaskBarIconEx::WindowProc - WM_TASKBARCREATED Detected"));
358
eventType = wxEVT_TASKBAR_CREATED;
360
else if ( WM_TASKBARSHUTDOWN == msg )
362
wxLogTrace(wxT("Function Status"), wxT("wxTaskBarIconEx::WindowProc - WM_TASKBARSHUTDOWN Detected"));
363
eventType = wxEVT_TASKBAR_SHUTDOWN;
365
if (msg != sm_taskbarMsg)
366
lReturnValue = DefWindowProc((HWND) hWnd, msg, wParam, lParam);
368
if ( 0 == eventType )
373
eventType = wxEVT_TASKBAR_LEFT_DOWN;
377
eventType = wxEVT_TASKBAR_LEFT_UP;
381
eventType = wxEVT_TASKBAR_RIGHT_DOWN;
385
eventType = wxEVT_TASKBAR_RIGHT_UP;
388
case WM_LBUTTONDBLCLK:
389
eventType = wxEVT_TASKBAR_LEFT_DCLICK;
392
case WM_RBUTTONDBLCLK:
393
eventType = wxEVT_TASKBAR_RIGHT_DCLICK;
397
eventType = wxEVT_TASKBAR_MOVE;
401
eventType = wxEVT_TASKBAR_CONTEXT_MENU;
405
eventType = wxEVT_TASKBAR_SELECT;
409
eventType = wxEVT_TASKBAR_KEY_SELECT;
412
case NIN_BALLOONSHOW:
413
eventType = wxEVT_TASKBAR_BALLOON_SHOW;
416
case NIN_BALLOONHIDE:
417
eventType = wxEVT_TASKBAR_BALLOON_HIDE;
420
case NIN_BALLOONTIMEOUT:
421
eventType = wxEVT_TASKBAR_BALLOON_TIMEOUT;
424
case NIN_BALLOONUSERCLICK:
425
eventType = wxEVT_TASKBAR_BALLOON_USERCLICK;
432
wxTaskBarIconExEvent event(eventType, this);
438
wxLogTrace(wxT("Function Start/End"), wxT("wxTaskBarIconEx::WindowProc - Function End"));
442
LRESULT APIENTRY wxTaskBarIconExWindowProc( HWND hWnd, unsigned msg, UINT wParam, LONG lParam )
444
return wxGetApp().GetTaskBarIcon()->WindowProc((WXHWND) hWnd, msg, wParam, lParam);
448
const char *BOINC_RCSID_46d006c50e = "$Id: taskbarex.cpp 15453 2008-06-23 18:48:59Z romw $";
1
/////////////////////////////////////////////////////////////////////////
3
// Purpose: Implements wxTaskBarIconEx class for manipulating icons on
4
// the Windows task bar.
5
// Author: Julian Smart
6
// Modified by: Rom Walton
8
// RCS-ID: $Id: taskbarex.cpp 22576 2010-10-21 16:02:49Z romw $
10
// Licence: wxWindows licence
11
/////////////////////////////////////////////////////////////////////////
14
#pragma implementation "taskbarex.h"
18
#include "BOINCGUIApp.h"
19
#include "msw/taskbarex.h"
20
#include "BOINCTaskBar.h"
23
// Add items new to Windows Vista and Windows 7
26
#define NIF_GUID 0x00000020
29
#define NIF_REALTIME 0x00000040
32
#define NIF_SHOWTIP 0x00000080
34
#ifndef NIIF_LARGE_ICON
35
#define NIIF_LARGE_ICON 0x00000010
37
#ifndef NIIF_RESPECT_QUIET_TIME
38
#define NIIF_RESPECT_QUIET_TIME 0x00000010
42
LRESULT APIENTRY wxTaskBarIconExWindowProc( HWND hWnd, unsigned msg, UINT wParam, LONG lParam );
44
wxChar* wxTaskBarExWindowClass = (wxChar*) wxT("wxTaskBarExWindowClass");
45
wxChar* wxTaskBarExWindow = (wxChar*) wxT("wxTaskBarExWindow");
47
const UINT WM_TASKBARCREATED = ::RegisterWindowMessage(wxT("TaskbarCreated"));
48
const UINT WM_TASKBARMESSAGE = ::RegisterWindowMessage(wxT("TaskbarMessage"));
49
const UINT WM_TASKBARSHUTDOWN = ::RegisterWindowMessage(wxT("TaskbarShutdown"));
50
const UINT WM_TASKBARAPPRESTORE = ::RegisterWindowMessage(wxT("TaskbarAppRestore"));
52
DEFINE_EVENT_TYPE( wxEVT_TASKBAR_CREATED )
53
DEFINE_EVENT_TYPE( wxEVT_TASKBAR_CONTEXT_MENU )
54
DEFINE_EVENT_TYPE( wxEVT_TASKBAR_SELECT )
55
DEFINE_EVENT_TYPE( wxEVT_TASKBAR_KEY_SELECT )
56
DEFINE_EVENT_TYPE( wxEVT_TASKBAR_BALLOON_SHOW )
57
DEFINE_EVENT_TYPE( wxEVT_TASKBAR_BALLOON_HIDE )
58
DEFINE_EVENT_TYPE( wxEVT_TASKBAR_BALLOON_TIMEOUT )
59
DEFINE_EVENT_TYPE( wxEVT_TASKBAR_BALLOON_USERCLICK )
60
DEFINE_EVENT_TYPE( wxEVT_TASKBAR_SHUTDOWN )
61
DEFINE_EVENT_TYPE( wxEVT_TASKBAR_APPRESTORE )
63
IMPLEMENT_DYNAMIC_CLASS(wxTaskBarIconEx, wxEvtHandler)
65
BEGIN_EVENT_TABLE (wxTaskBarIconEx, wxEvtHandler)
66
EVT_CLOSE(wxTaskBarIconEx::OnClose)
67
EVT_TASKBAR_CREATED(wxTaskBarIconEx::OnTaskBarCreated)
71
wxTaskBarIconEx::wxTaskBarIconEx()
73
m_pTaskbarMutex = new wxMutex();
76
m_hWnd = CreateTaskBarWindow( wxTaskBarExWindow );
79
wxTaskBarIconEx::wxTaskBarIconEx( wxChar* szWindowTitle, wxInt32 iTaskbarID )
81
m_pTaskbarMutex = new wxMutex();
82
m_iTaskbarID = iTaskbarID;
84
m_hWnd = CreateTaskBarWindow( szWindowTitle );
87
wxTaskBarIconEx::~wxTaskBarIconEx()
96
::DestroyWindow((HWND) m_hWnd);
102
void wxTaskBarIconEx::OnClose(wxCloseEvent& WXUNUSED(event))
104
::DestroyWindow((HWND) m_hWnd);
108
void wxTaskBarIconEx::OnTaskBarCreated(wxTaskBarIconExEvent& WXUNUSED(event))
115
bool wxTaskBarIconEx::SetIcon(const wxIcon& icon, const wxString& message)
123
memset(¬ifyData, 0, sizeof(NOTIFYICONDATA));
124
notifyData.cbSize = sizeof(notifyData);
125
notifyData.hWnd = (HWND) m_hWnd;
126
notifyData.uID = m_iTaskbarID;
127
notifyData.uCallbackMessage = WM_TASKBARMESSAGE;
128
notifyData.uFlags = NIF_MESSAGE | NIF_ICON | NIF_REALTIME;
129
notifyData.uVersion = NOTIFYICON_VERSION;
130
notifyData.hIcon = (HICON) icon.GetHICON();
132
if (!message.empty()) {
133
notifyData.uFlags |= NIF_TIP;
134
lstrcpyn(notifyData.szTip, WXSTRINGCAST message, sizeof(notifyData.szTip));
141
bool wxTaskBarIconEx::SetBalloon(const wxIcon& icon, const wxString title, const wxString message, unsigned int iconballoon)
149
memset(¬ifyData, 0, sizeof(NOTIFYICONDATA));
150
notifyData.cbSize = sizeof(notifyData);
151
notifyData.hWnd = (HWND) m_hWnd;
152
notifyData.uID = m_iTaskbarID;
153
notifyData.uCallbackMessage = WM_TASKBARMESSAGE;
154
notifyData.uFlags = NIF_MESSAGE | NIF_INFO | NIF_ICON | NIF_REALTIME;
155
notifyData.dwInfoFlags = iconballoon | NIIF_NOSOUND | NIIF_RESPECT_QUIET_TIME;
156
notifyData.uVersion = NOTIFYICON_VERSION;
157
notifyData.hIcon = (HICON) icon.GetHICON();
159
lstrcpyn(notifyData.szInfoTitle, WXSTRINGCAST title, sizeof(notifyData.szInfoTitle));
160
lstrcpyn(notifyData.szInfo, WXSTRINGCAST message, sizeof(notifyData.szInfo));
166
bool wxTaskBarIconEx::QueueBalloon(const wxIcon& icon, const wxString title, const wxString message, unsigned int iconballoon)
174
memset(¬ifyData, 0, sizeof(NOTIFYICONDATA));
175
notifyData.cbSize = sizeof(notifyData);
176
notifyData.hWnd = (HWND) m_hWnd;
177
notifyData.uID = m_iTaskbarID;
178
notifyData.uCallbackMessage = WM_TASKBARMESSAGE;
179
notifyData.uFlags = NIF_MESSAGE | NIF_INFO | NIF_ICON;
180
notifyData.dwInfoFlags = iconballoon | NIIF_RESPECT_QUIET_TIME;
181
notifyData.uVersion = NOTIFYICON_VERSION;
182
notifyData.hIcon = (HICON) icon.GetHICON();
184
lstrcpyn(notifyData.szInfoTitle, WXSTRINGCAST title, sizeof(notifyData.szInfoTitle));
185
lstrcpyn(notifyData.szInfo, WXSTRINGCAST message, sizeof(notifyData.szInfo));
191
bool wxTaskBarIconEx::RemoveIcon()
196
memset(¬ifyData, 0, sizeof(NOTIFYICONDATA));
197
notifyData.cbSize = sizeof(notifyData);
198
notifyData.hWnd = (HWND) m_hWnd;
199
notifyData.uID = m_iTaskbarID;
203
return (Shell_NotifyIcon(NIM_DELETE, ¬ifyData) != 0);
206
void wxTaskBarIconEx::UpdateIcon()
210
Shell_NotifyIcon(NIM_MODIFY, ¬ifyData);
214
m_iconAdded = (Shell_NotifyIcon(NIM_ADD, ¬ifyData) != 0);
215
if (IsBalloonsSupported())
217
Shell_NotifyIcon(NIM_SETVERSION, ¬ifyData);
222
bool wxTaskBarIconEx::PopupMenu(wxMenu *menu)
224
wxMutexLocker lock(*m_pTaskbarMutex);
225
if (!lock.IsOk()) return false;
230
wxGetMousePosition(&x, &y);
232
// is wxFrame the best window type to use???
233
win = new wxFrame(NULL, -1, wxEmptyString, wxPoint(x,y), wxSize(-1,-1), 0);
234
win->PushEventHandler(this);
236
// Remove from record of top-level windows, or will confuse wxWindows
237
// if we try to exit right now.
238
wxTopLevelWindows.DeleteObject(win);
242
// Work around a WIN32 bug
243
::SetForegroundWindow ((HWND) win->GetHWND());
245
rval = win->PopupMenu(menu, 0, 0);
247
// Work around a WIN32 bug
248
::PostMessage ((HWND) win->GetHWND(), WM_NULL, 0, 0L);
250
win->PopEventHandler(FALSE);
257
bool wxTaskBarIconEx::FireAppRestore()
259
HWND hWnd = ::FindWindow(wxTaskBarExWindowClass, NULL);
261
::SendMessage(hWnd, WM_TASKBARAPPRESTORE, NULL, NULL);
267
WXHWND wxTaskBarIconEx::CreateTaskBarWindow( wxChar* szWindowTitle )
269
HINSTANCE hInstance = GetModuleHandle(NULL);
273
if (!::GetClassInfo( hInstance, wxTaskBarExWindowClass, &wc )) {
274
wc.style = CS_HREDRAW | CS_VREDRAW;
275
wc.lpfnWndProc = (WNDPROC) wxTaskBarIconExWindowProc;
278
wc.hInstance = hInstance;
281
wc.hbrBackground = 0;
282
wc.lpszMenuName = NULL;
283
wc.lpszClassName = wxTaskBarExWindowClass;
284
::RegisterClass(&wc);
287
hWnd = ::CreateWindowEx (
289
wxTaskBarExWindowClass,
305
bool wxTaskBarIconEx::IsBalloonsSupported()
307
wxInt32 iMajor = 0, iMinor = 0;
308
if ( wxWINDOWS_NT == wxGetOsVersion( &iMajor, &iMinor ) )
310
if ( (6 >= iMajor) || ((5 >= iMajor) && (0 <= iMinor)) )
316
long wxTaskBarIconEx::WindowProc( WXHWND hWnd, unsigned int msg, unsigned int wParam, long lParam )
318
wxEventType eventType = 0;
319
long lReturnValue = 0;
321
if ( WM_CLOSE == msg )
323
wxCloseEvent eventClose(wxEVT_CLOSE_WINDOW);
324
ProcessEvent(eventClose);
326
if ( !eventClose.GetSkipped() ) {
327
lReturnValue = DefWindowProc((HWND) hWnd, msg, wParam, lParam);
332
else if ( WM_TASKBARCREATED == msg )
334
eventType = wxEVT_TASKBAR_CREATED;
336
else if ( WM_TASKBARSHUTDOWN == msg )
338
eventType = wxEVT_TASKBAR_SHUTDOWN;
340
else if ( WM_TASKBARAPPRESTORE == msg )
342
eventType = wxEVT_TASKBAR_APPRESTORE;
344
else if ( WM_TASKBARMESSAGE == msg )
349
eventType = wxEVT_TASKBAR_LEFT_DOWN;
353
eventType = wxEVT_TASKBAR_LEFT_UP;
357
eventType = wxEVT_TASKBAR_RIGHT_DOWN;
361
eventType = wxEVT_TASKBAR_RIGHT_UP;
364
case WM_LBUTTONDBLCLK:
365
eventType = wxEVT_TASKBAR_LEFT_DCLICK;
368
case WM_RBUTTONDBLCLK:
369
eventType = wxEVT_TASKBAR_RIGHT_DCLICK;
373
eventType = wxEVT_TASKBAR_MOVE;
377
eventType = wxEVT_TASKBAR_CONTEXT_MENU;
381
eventType = wxEVT_TASKBAR_SELECT;
385
eventType = wxEVT_TASKBAR_KEY_SELECT;
388
case NIN_BALLOONSHOW:
389
eventType = wxEVT_TASKBAR_BALLOON_SHOW;
392
case NIN_BALLOONHIDE:
393
eventType = wxEVT_TASKBAR_BALLOON_HIDE;
396
case NIN_BALLOONTIMEOUT:
397
eventType = wxEVT_TASKBAR_BALLOON_TIMEOUT;
400
case NIN_BALLOONUSERCLICK:
401
eventType = wxEVT_TASKBAR_BALLOON_USERCLICK;
407
lReturnValue = DefWindowProc((HWND) hWnd, msg, wParam, lParam);
412
wxTaskBarIconExEvent event(eventType, this);
413
lReturnValue = ProcessEvent(event);
419
LRESULT APIENTRY wxTaskBarIconExWindowProc( HWND hWnd, unsigned msg, UINT wParam, LONG lParam )
421
return wxGetApp().GetTaskBarIcon()->WindowProc((WXHWND) hWnd, msg, wParam, lParam);