Fix wxTaskBarIcon to work under all Windows versions.

When the code was compiled using a new SDK, creating wxTaskBarIcon failed
under older Windows systems because of a too big NOTIFYICONDATA size specified
by the program.

Fix this by using the fixed NOTIFYICONDATA_V2_SIZE to get old version of the
struct which nevertheless contains everything we need and even fall back to
NOTIFYICONDATA_V1_SIZE for Win9x if needed.

Closes #11886.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63849 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2010-04-04 13:19:58 +00:00
parent 961f4d0ce6
commit 63d690d7c5
2 changed files with 30 additions and 2 deletions

View File

@ -530,6 +530,7 @@ MSW:
- Allow to not create wxPaintDC in EVT_PAINT handler.
- Fix sending of wxEVT_COMMAND_LIST_COL_DRAGGING events in wxListCtrl.
- Allow putting the UAC symbol on buttons (Chris Spencer).
- Fix wxTaskBarIcon for older Windows systems (Daniel Wyatt).
i18n:

View File

@ -45,6 +45,21 @@
#define NIF_INFO 0x00000010
#endif
#ifndef NOTIFYICONDATA_V1_SIZE
#ifdef UNICODE
#define NOTIFYICONDATA_V1_SIZE 0x0098
#else
#define NOTIFYICONDATA_V1_SIZE 0x0058
#endif
#endif
#ifndef NOTIFYICONDATA_V2_SIZE
#ifdef UNICODE
#define NOTIFYICONDATA_V2_SIZE 0x03A8;
#else
#define NOTIFYICONDATA_V2_SIZE 0x01E8;
#endif
#endif
// initialized on demand
static UINT gs_msgTaskbar = 0;
@ -133,7 +148,19 @@ struct NotifyIconData : public NOTIFYICONDATA
NotifyIconData(WXHWND hwnd)
{
memset(this, 0, sizeof(NOTIFYICONDATA));
cbSize = sizeof(NOTIFYICONDATA);
// Do _not_ use sizeof(NOTIFYICONDATA) here, it may be too big if we're
// compiled with newer headers but running on an older system and while
// we could do complicated tests for the exact system version it's
// easier to just use an old size which should be supported everywhere
// from Windows 2000 up and which is all we need as we don't use any
// newer features so far. But if we're running under a really ancient
// system (Win9x), fall back to even smaller size -- then the balloon
// related features won't be available but the rest will still work.
cbSize = wxTheApp->GetShell32Version() >= 500
? NOTIFYICONDATA_V2_SIZE
: NOTIFYICONDATA_V1_SIZE;
hWnd = (HWND) hwnd;
uCallbackMessage = gs_msgTaskbar;
uFlags = NIF_MESSAGE;
@ -231,7 +258,7 @@ wxTaskBarIcon::ShowBalloon(const wxString& title,
// the balloon disappearance
NotifyIconData notifyData(hwnd);
notifyData.uFlags = 0;
notifyData.uVersion = 3 /* NOTIFYICON_VERSION for Windows XP */;
notifyData.uVersion = 3 /* NOTIFYICON_VERSION for Windows 2000/XP */;
if ( !wxShellNotifyIcon(NIM_SETVERSION, &notifyData) )
{