Thread View: borland.public.cppbuilder.nativeapi
3 messages
3 total messages
Started by Mike Collins
Tue, 24 Jun 2008 17:55
System Tray Balloon Tips displaying incorrect icons.
Author: Mike Collins
Date: Tue, 24 Jun 2008 17:55
Date: Tue, 24 Jun 2008 17:55
112 lines
4781 bytes
4781 bytes
Hi all,
I'm having two issues with my system tray application. I posted about it
some time ago but didn't get any ideas and didn't chase it up. Background
is that I have a System Tray application that displays Balloon tips to the
user when certain events happen. These notification events are sent to the
system tray application via an IPC channel.
My first issue is (and it may be the cause of my second problem) is that
when I display a balloon tip, with a custom icon, my system tray icon
changes to that of the balloon tip - the two do not seem to change
independently of each other. I overcame this with a hack by forcing the
system tray icon to be changed again, straight after the call to display the
balloon tip but it's not great.
I have several wrapper functions to allow various different changes, these
look like this :
bool TMainForm::SetSysTrayIcon(UINT p_uResId)
{
bool bRtn = false;
if (bTrayIconActive)
{
EnterCriticalSection(&csIPCCallBack);
try
{
HICON hIcon = (HICON)Utils->RtnIcon(p_uResId, 16);
//LR_DEFAULTCOLOR);
nid.hIcon = hIcon;
nid.uFlags = NIF_ICON;
bRtn = (bool)Shell_NotifyIcon(NIM_MODIFY, &nid);
::DestroyIcon(hIcon);
}
__finally
{
LeaveCriticalSection(&csIPCCallBack);
}
}
return bRtn;
}
bool TMainForm::SetBalloonTip(const AnsiString &p_szTitle, const AnsiString
&p_szBody, DWORD p_dwIcon,
UINT p_uTimeout, bool p_bRespondUClick)
{
bool bRtn = false;
if (bTrayIconActive)
{
EnterCriticalSection(&csIPCCallBack);
try
{
HICON hIcon = NULL;
if ((p_dwIcon >= NIIF_NONE) && (p_dwIcon <= NIIF_ERROR))
{
nid.uFlags = NIF_INFO;
nid.dwInfoFlags = p_dwIcon;
}
else
{
nid.uFlags = NIF_INFO | NIF_ICON;
nid.dwInfoFlags = NIIF_USER;
hIcon = (HICON)Utils->RtnIcon(p_dwIcon, 16); //
LR_DEFAULTCOLOR);
nid.hIcon = hIcon;
}
nid.uTimeout = (p_uTimeout * 1000); // convert time to ms
lstrcpyn(nid.szInfoTitle, p_szTitle.c_str(),
MAX_TRAY_BALLOON_TITLE);
lstrcpyn(nid.szInfo, p_szBody.c_str(), MAX_TRAY_BALLOON_BODY);
if (!bRespondToUserClick)
bRespondToUserClick = p_bRespondUClick;
if (bRtn = (bool)Shell_NotifyIcon(NIM_MODIFY, &nid))
{
lstrcpyn(nid.szInfoTitle, "\0", MAX_TRAY_BALLOON_TITLE);
lstrcpyn(nid.szInfo, "\0", MAX_TRAY_BALLOON_BODY);
}
if (hIcon)
::DestroyIcon(hIcon);
}
__finally
{
LeaveCriticalSection(&csIPCCallBack);
}
}
return bRtn;
}
So, like I said, if I call SetBalloonTip(), with a custom icon (not one of
the default ones) my system tray icon also changes. I overcame it my doing
this:
SetBalloonTip()
SetSysTrayIcon()
- which forces the original system tray icon to be re-displayed - the
flicker isn't noticeable but I don't like it.
My second problem may be related to the first. My system tray applicationis
forced to run when a user logs on using the HKLM Run registry key. When my
System Tray first runs, it displays a balloon tip to instruct the user
that it is running correctly. however, when the user logs on, the balloon
tip that is displayed, shows the icon of the last balloon that was
displayed. I've posted a screen shot to show what I mean to
borland.public.attachments. In this case, my balloon tip is showing that of
the Windows Security Alerts balloon tip
Hope this all makes sense, any help would be excellent.
Mike C
Re: System Tray Balloon Tips displaying incorrect icons.
Author: Remy Lebeau (TeamB)
Date: Tue, 24 Jun 2008 17:05
Date: Tue, 24 Jun 2008 17:05
24 lines
1846 bytes
1846 bytes
"Mike Collins" <its@TheBottomOfThePost> wrote in message news:4861244e@newsgroups.borland.com... > So, like I said, if I call SetBalloonTip(), with a custom icon > (not one of the default ones) my system tray icon also changes. That is because you are changing the tray icon in both calls. You did not say which OS you are running. NIIF_USER only works on XP SP2 and later. For XP SP1 and earlier, NIIF_USER has no effect, thus you cannot apply custom icons. In Vista, use the nid.hBalloonIcon member instead of nid.hIcon. > I overcame it my doing this: > > SetBalloonTip() > SetSysTrayIcon() Only because you are changing the nid.hIcon member in SetBalloonTip(), and then changing it back in SetSysTrayIcon(). Which would suggest that NIIF_USER does not work on your system. Gambit
Re: System Tray Balloon Tips displaying incorrect icons.
Author: Mike Collins
Date: Tue, 24 Jun 2008 18:31
Date: Tue, 24 Jun 2008 18:31
15 lines
1316 bytes
1316 bytes
Hay Remy, The screen shots that you can see is taken from Windows XP service Pack 2 - should work based on this... I would assum that is NIIF_USER was not supported, I wouldn't be able to change the icon at all, which i can. Any other ideas? Mike "Remy Lebeau (TeamB)" <no.spam@no.spam.com> wrote in message news:486129a7@newsgroups.borland.com... >
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads