Changement de sessions et icones

Joccy Messages postés 7 Date d'inscription jeudi 3 décembre 2009 Statut Membre Dernière intervention 2 août 2011 - 25 nov. 2010 à 10:34
Joccy Messages postés 7 Date d'inscription jeudi 3 décembre 2009 Statut Membre Dernière intervention 2 août 2011 - 29 nov. 2010 à 09:38
Bonjour,

Voila, je dessine une icone personnalisable (grâce aux fichiers CMeterIcon.h/cpp trouvés sur le Web et qui fonctionnent très bien ) dans ma barre des taches windows.
Malheureusement, lors d'un changement de session, cette icone disparait !
Il semblerait que cela provienne de la fonction CreateIconIndirect() de Windows que l'on utilise ... (J'avais aussi le problème avec la fonction DuplicateIcon() mais j'ai réussi à m'en débarrasser en faisant simplement une affectation ).
Quelqu'un a-t-il déjà eu ce genre de problème et si oui, comment le résoudre ?
Merci de votre aide.

Joccy

6 réponses

Joccy Messages postés 7 Date d'inscription jeudi 3 décembre 2009 Statut Membre Dernière intervention 2 août 2011
25 nov. 2010 à 10:37
Petites précisions, mon application est un service lancé automatiquement au démarrage, je suis sous VisualStudio 6.0 C++.


Joccy
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
25 nov. 2010 à 22:15
Lorsque ta fenêtre reçoit le message WM_TASKBARCREATED, tu dois rappeler Shell_NotifyIcon avec NIM_ADD.

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
0
Joccy Messages postés 7 Date d'inscription jeudi 3 décembre 2009 Statut Membre Dernière intervention 2 août 2011
26 nov. 2010 à 08:12
Merci de ta réponse.
J'ai repris le code de quelqu'un d'autre alors ce n'est pas simple.
Ce que je sais c'est qu'au moment de la création de la taskbar, j'appelle bien le shell notification (add) mais à priori ca ne fonctionne pas ...
En fait, on n'utilise pas WM_TASKBARCREATED mais un mecanisme à priori similaire:
const UINT	g_TaskbarRestartMsg = RegisterWindowMessage(TEXT("TaskbarCreated"));
BEGIN_MESSAGE_MAP(CMainFrame, CServiceWindow)
//{{AFX_MSG_MAP(CMainFrame)
...
ON_REGISTERED_MESSAGE(g_TaskbarRestartMsg, OnTaskBarRestart)
//}}AFX_MSG_MAP
// Global help commands
END_MESSAGE_MAP()

afx_msg LRESULT OnTaskBarRestart(UINT p_uiCmd, LONG p_lParam);

LRESULT CMainFrame::OnTaskBarRestart(UINT p_uiCmd, LONG p_lParam)
{
trace_("CMainFrame::OnTaskBarRestart");
removeTaskbarIcon(); // NIM_DELETE
addTaskbarIcon();    // NIM_ADD
UpdateTaskBarIcon(); // calcule la nouvelle icone avec CreateIconIndirect() puis la modifie NIM_MODIFY
return 0;
}

Et dans ces fonctions, comme leur nom l'indique, on "joue" avec la taskbar et donc le shell notification ...
Ma trace fonctionne bien, je passe bien dans cette fonction lors du changement de session, mes icones se changent bien, sauf celle qui utilise "CreateIconIndirect" !!!
Pourtant, j'ai beaucoup cherché sur le net et ceux qui ont rencontré un probleme similaire (l'explorer qui crashe et l'icone ne s'affiche plus) ont refait un add et ca marche. Mais pas chez moi ... Est-ce parce que mon appli est un sercice ?
Merci encore.

Joccy
0
Joccy Messages postés 7 Date d'inscription jeudi 3 décembre 2009 Statut Membre Dernière intervention 2 août 2011
26 nov. 2010 à 10:46
Bon, dans la classe CMeterIcon, on dessine l'icone, avec des HDC et autres contextes.

HICON CMeterIcon::CreateMeterIcon(int *pBarData)
// the returned icon must be cleaned up using DestroyIcon()
{// begin CreateMeterIcon
ICONINFO iiNewIcon;
HICON hNewIcon;
HICON hTmpIcon;
iiNewIcon.fIcon = true;

// create DC's
HDC hScreenDC = ::GetDC(NULL);
HDC hIconDC = CreateCompatibleDC(hScreenDC);
HDC hMaskDC = CreateCompatibleDC(hScreenDC);

hTmpIcon = m_hFrame;

if(!GetIconInfo(hTmpIcon,&iiNewIcon))
{
return NULL;
}

if(!::ReleaseDC(NULL,hScreenDC)) // release this ASAP
{// begin DC not released
return NULL;
}// end DC not released

HGDIOBJ hOldIconDC = ::SelectObject(hIconDC,iiNewIcon.hbmColor);
HGDIOBJ hOldMaskDC = ::SelectObject(hMaskDC,iiNewIcon.hbmMask);

// draw the meters
for(int i = 0;i < m_nNumBars;i++)
if(DrawIconMeter(hIconDC,hMaskDC,pBarData[i],i) == false)
return NULL;


// create icon
::SelectObject(hIconDC,hOldIconDC);
::SelectObject(hMaskDC,hOldMaskDC);

hNewIcon = CreateIconIndirect(&iiNewIcon);

// cleanup
DestroyIcon(hTmpIcon);
DeleteObject(iiNewIcon.hbmColor);
DeleteObject(iiNewIcon.hbmMask);
DeleteDC(hMaskDC);
DeleteDC(hIconDC);

return hNewIcon;

}// end CreateMeterIcon

Peut-etre est-ce le HDC qui n'est plus le bon après changement de session ? (pourtant, je reviens sur le même compte pour le moment)...
Une idée ? Merci.

Joccy
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
26 nov. 2010 à 17:34
Quelle erreur est retournée par GetLastError ?

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
0
Joccy Messages postés 7 Date d'inscription jeudi 3 décembre 2009 Statut Membre Dernière intervention 2 août 2011
29 nov. 2010 à 09:38
Ben, c'est pas si simple, mais je viens de trouver d'ou vient le probleme (j'étudie encore pourquoi ca fait planter!! ) :
Dans un timer, si le modify retourne FALSE, je fais un remove / add et à priori c'est là que ca "plante" !!!! Pas tout compris !
Je n'ai pas d'erreur, tout a l'air de fonctionner, sauf que je ne voyais rien dans ma barre, aucune icone de cette appli. En supprimant ce timer, ca marche ...

Merci de votre aide . Je vais considérer que j'ai résolu le problème, mais j'avoue que je ne comprends pas pourquoi.

Joccy
0
Rejoignez-nous