[Win32] Tray icon terug laten komen na crash explorer.exe

Pagina: 1
Acties:

  • eborn
  • Registratie: April 2000
  • Laatst online: 20-08 15:45
Het is natuurlijk een bekend probleem: als explorer.exe crashed ben je vaak een aantal systray icons kwijt. Nu vroeg ik me alleen af waarom sommige icons wel terugkomen en andere niet. Mijn eigen programma maakt namelijk ook gebruik van een tray icoon, maar komt dus na een crash niet meer terug. Programma's zoals mIRC, GrabIt of gewoon de standaard Windows icons wel. Is er een bepaalde truc in de Win32 API waarmee je dit kunt afdwingen? Ik heb al wat zitten zoeken, maar ik kan eigenlijk niet echt iets vinden. Het enige wat je overal leest is dat er tooltjes zijn die dit kunnen oplossen (TraySaver bijv.) Maar zoals ik het nu zie moet er dus een technische oorzaak voor het niet meer opnieuw verschijnen zijn.

Misschien dat een echte die-hard Win32 coder hier iets over weet te vertellen? :)

  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 22:29

johnwoo

3S-GTE

Je zou om de zoveel tijd (5 of 10 seconden ofzo) kunnen proberen om je tray icon te updaten met dezelfde gegevens als dat er al in staan (met NIM_MODIFY). Als dat niet lukt is explorer blijkbaar gecrashed en moet je je icoontje weer even toevoegen met NIM_ADD :)

Op deze manier heb je binnen de tijdsperiode die je als interval kiest je icoontje terug, maar misschien zijn er nog wel mooiere oplossingen die niet met polling werken...

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


Verwijderd

Er wordt een WM_TASKBARCREATED bericht gestuurd wanneer de explorer opnieuw is gestart (bijv. na een crash). Wanneer je op dat moment je icoon opnieuw in de tray zet, is dat voldoende om het goed te laten werken. Dan hoef je niet lastig te gaan doen met een timer die je om de x minuten je icoon laat verversen.

Verwijderd

aha, dat is dus de truc, nu nog een manier om dit te testen, daar een idee voor?

  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 22:29

johnwoo

3S-GTE

Verwijderd schreef op 22 June 2003 @ 21:57:
aha, dat is dus de truc, nu nog een manier om dit te testen, daar een idee voor?
Task manager -> kill explorer.exe -> New Task -> explorer.exe :Y)

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


Verwijderd

Verwijderd schreef op 22 June 2003 @ 21:57:
aha, dat is dus de truc, nu nog een manier om dit te testen, daar een idee voor?
In Windows 2000/XP gewoon via taakbeheer bij explorer.exe het proces beëindigen, en voor de zekerheid een commandoprompt open laten staan waarin je door 'explorer' in te tikken de explorer-shell weer kunt laden. Op die manier is het prima te testen.

  • Mr.Nobody
  • Registratie: Oktober 2001
  • Niet online
zoek eens op traysaver. dat programma cached de icoontjes.

edit: hier dus http://www.mlin.net/TraySaver.shtml

edit: shit hee, helemaal verkeerd gelezen :o
laat dus maar :)

[ Voor 56% gewijzigd door Mr.Nobody op 22-06-2003 22:14 ]

Opensource delphi componenten (http://www.delphi-jedi.org)


  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 22:29

johnwoo

3S-GTE

Even voor de duidelijkheid... Ik heb even gezocht op WM_TASKBARCREATED, maar dat is geen constante die je terugvindt in een include file. Je kan em zo definieren:
C:
1
const UINT WM_TASKBARCREATED = RegisterWindowMessage(_TEXT("TaskbarCreated"));

En als je wil zou je em dus ook WM_BLAAT kunnen noemen :+
edit:
Ow, en het werkt alleen op Win98 of hoger of IE 4.0 of hoger.

[ Voor 13% gewijzigd door johnwoo op 22-06-2003 22:12 ]

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


  • eborn
  • Registratie: April 2000
  • Laatst online: 20-08 15:45
Iedereen alvast bedankt voor z'n reactie!

De timer had ik inderdaad ook al aan gedacht. Maar als het i.d.d. mooier kan via de truc van johnwoo dan is dat natuurlijk de betere optie.
johnwoo schreef op 22 June 2003 @ 22:10:
Even voor de duidelijkheid... Ik heb even gezocht op WM_TASKBARCREATED, maar dat is geen constante die je terugvindt in een include file. Je kan em zo definieren:
C:
1
stukje code

En als je wil zou je em dus ook WM_BLAAT kunnen noemen :+
edit:
Ow, en het werkt alleen op Win98 of hoger of IE 4.0 of hoger.
Ik ga het zo snel mogelijk eens proberen :) En wat betreft Win98, dat is deze keer niet zo'n probleem. Het is toch maar een programma wat eigenlijk alleen binnenshuis wordt gebruikt ;)

[ Voor 9% gewijzigd door eborn op 22-06-2003 22:36 ]


  • eborn
  • Registratie: April 2000
  • Laatst online: 20-08 15:45
Ik heb het inmiddels in mijn programma aangepast en het werkt perfect. Enig puntje: als ik de constante WM_TASKBARCREATED als onderdeel van mijn switch statement wil gebruiken begint hij te 'zeuren' dat de waarde geen constante is. Terwijl de 'variabele' toch echt gedefinieerd staat met const ervoor. Zie ik iets over het hoofd? :)

Ik heb het nu maar even provisorisch opgelost door een extra if-statement boven de switch constructie te hangen. Het werkt, maar netjes is anders natuurlijk ;)

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

eborn schreef op 28 juni 2003 @ 13:30:
Ik heb het nu maar even provisorisch opgelost door een extra if-statement boven de switch constructie te hangen. Het werkt, maar netjes is anders natuurlijk ;)
Sja het is correct, en dus netjes. Switch kan alleen op compile-time constantes, en daar je op runtime pas RegisterWindowMessage aanroept is dit geen compiletime constante.

Het hele verhaal staat overigens gewoon in MSDN uitgelegd. :Y)

Professionele website nodig?

Pagina: 1