Toon posts:

[VB6] Het refreshen van de system tray

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een applicatie dat voordat het start een ander programma door middel van TerminateProcess killt. Niet helemaal netjes omdat er dan geen cleanup plaats vindt, maar dat even terzijde. Het probleem is dat het programma dat word geterminate een icoontje heeft in de SysTray.

Je raadt het al, het icoontje blijft lekker zitten in de SysTray tot het moment dat je met de muis over het icoontje heen vliegt, waarna het verdwijnt.

Waar ik eigenlijk naar op zoek ben is een manier om de SysTray na het killen een refresh actie te geven, zodat ik niet na een paar keer herstarten van de applicatie 6 icoontjes op een rij zie staan, waarvan er maar eentje echt actief is ;).

Ik heb trouwens al geprobeerd om er lekker een icoontje bij te krassen met Shell_NotifyIcon, in de hoop dat er dan automatisch een refresh actie volgt, geen succes.

Wat ik eigenlijk zat te denken is van de SysTray de Window handle te verkrijgen en daar gewoon met SendMessage wat naartoe sturen, maar hoe kom ik achter de window handle?

Andere suggesties zijn natuurlijk ook van harte welkom. :Y)

[ Voor 19% gewijzigd door Verwijderd op 12-10-2005 11:03 ]


  • Tukk
  • Registratie: Januari 2002
  • Laatst online: 23-04 14:43

Tukk

De α-man met het ẞ-brein

Al de functionaliteit van onderstaande bekeken?

code:
1
2
3
4
Private Declare Function apiDestroyIcon Lib "user32" _
   Alias "DestroyIcon" _
   (ByVal hIcon As Long) _
   As Long


Zelf nog nooit gebruikt, maar lijkt me wel wat je zoekt..

Je kan je signature wel vervangen, gefeli ;)

Q: How many geeks does it take to ruin a joke? A: You mean nerd, not geek. And not joke, but riddle. Proceed.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
^^
Dan moet je dus wel op de een of andere manier een handle naar het Icon zien te krijgen. Wat mij veel beter lijkt is de applicatie meteen netjes killen, dan heb je ook heel het probleem niet. Waarom stuur je de "te terminaten" applicatie niet netjes een message met SendMessage in de trend van WM_Close ofzo :? (dus in plaats van dat je 'm onderuit schopt zonder pardon)

[ Voor 55% gewijzigd door RobIII op 12-10-2005 12:21 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • DemonTPx
  • Registratie: December 2002
  • Laatst online: 20-04 17:27
Zorgt TerminateProcess er niet voor dat de Form_QueryUnload, van de applicatie die afgesloten wordt, ook niet gerunt wordt?
Dan zou je gewoon het verwijderen van het icoontje daarin kunnen zetten.

Verwijderd

Ik heb dit stukje code gevonden ( niet zelf geprobeerd ! ), maar misschien dat je hier iets aan hebt. :
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Public Sub CleanupTray() 
    Dim hTaskbar As Long, hTray As Long 
    Dim rcTray As RECT 
    Dim X As Long 


    hTaskbar = FindWindowEx(0, 0, "Shell_TrayWnd", vbNullString) 
    If hTaskbar Then 
      hTray = FindWindowEx(hTaskbar, 0, "TrayNotifyWnd", vbNullString) 
        If hTray Then 
            GetClientRect hTray, rcTray 
            For X = 0 To rcTray.Right Step 8 
               PostMessage hTray, WM_MOUSEMOVE, 0, ByVal (&H80000 + X) 
            Next 
        End If 
    End If 
End Sub


Zo te zien zoekt het het window van de systray, en stuurt er dan een aantal WM_Mousemove messages naartoe ( om de acht pixels )

[edit]Zoals ik al zei heb ik de code zelf niet getest, maar zo te zien moet er nog wel een aanpassing worden gemaakt. Deze code houdt namelijk geen rekening met het feit dat er wel eens meerdere rijen met icons kunnen staan, dus zul je dat zelf nog even moeten inbouwen

[ Voor 17% gewijzigd door Verwijderd op 18-10-2005 17:12 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op dinsdag 18 oktober 2005 @ 17:09:
Ik heb dit stukje code gevonden ( niet zelf geprobeerd ! ), maar misschien dat je hier iets aan hebt. :
Visual Basic:
1
<knip>


Zo te zien zoekt het het window van de systray, en stuurt er dan een aantal WM_Mousemove messages naartoe ( om de acht pixels )

[edit]Zoals ik al zei heb ik de code zelf niet getest, maar zo te zien moet er nog wel een aanpassing worden gemaakt. Deze code houdt namelijk geen rekening met het feit dat er wel eens meerdere rijen met icons kunnen staan, dus zul je dat zelf nog even moeten inbouwen
Over ranzig gesproken :X

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Ben ik het helemaal met je mee eens, maar het is de enige oplossing die ik kon vinden op het net.
Pagina: 1