Avatar billede tjacob Juniormester
18. marts 2003 - 08:31 Der er 12 kommentarer og
2 løsninger

SysTray opfører sig underligt

Jeg har et VB-prog, der åbner en anden app (et internet logon program) med Shell, og gemmer ProcessID'en, således at jeg senere kan lukke app'en igen med noget API. -Det fungerer fint.

Denne app viser et ikon i SysTray'en når den kører. Men når jeg lukker den ned (fra mit program), så forsvinder ikonet IKKE fra SysTray, og det ser ud som om at den stadig kører.
Hvis jeg fører musen hen over SysTray'en, så forsvinder det godt nok.  ???
(Hvis app lukkes normalt [-fra sig selv] er der ingen problemer.

Spm:

1) Kan jeg forhindre at app'ens ikon vises i SysTrayen i første omgang?
  Dette ville være den bedste løsning.

2) Hvis ikke, hvordan 'opdaterer' jeg så SysTray, således at ikonet forsvinder ved nedlukning?

PS -kører XP Pro.

/tjacob
Avatar billede joern Nybegynder
18. marts 2003 - 16:54 #1
Hej.

Jeg har set at flere af de programmer, der anbringer en ikon i systray, i deres options har mulighed for at afstille dette.  Kig ad.

M.v.h. Jørn
Avatar billede tjacob Juniormester
18. marts 2003 - 18:31 #2
Ja, det har jeg styr på. Det er når din egen App anbringer et ikon.

I dette tilfælde er det et fremmed program der sætter ikonet. Dette program kalder jeg med Shell, men jeg har ingen handle til det ikon programmet har sat i SysTray. -kun til selve processen (der er intet vindue) der åbner programmet.
Avatar billede joern Nybegynder
18. marts 2003 - 20:16 #3
Hej.

Det lyder underligt.  Flere spørgsmål på 'Eksperten' har drejet sig om at folk så inderligt vil have deres program til at anbringe et ikon i SysTray, det sker da ikke ellers for et VB-program.  Du mener at det program, du kalder via shell anbringer standard VB-ikonet i SysTray?  Eller hvad er det for et ikon, jeg mener billedet?

M.v.h. Jørn
Avatar billede tjacob Juniormester
18. marts 2003 - 21:18 #4
Det program jeg kalder er IKKE noget VB program. Det er et almindeligt exe program, der sætter et ikon i systray som så mange andre programmer.
F.eks. er lydindstillinger på de fleste computere synligt med et lille højttaler ikon.
Når man åbner dette program, så vises dets ikon i systray, indtil man lukker det igen.
Når jeg har åbnet -og lukket- dette program (og det ER lukket) fra MIT VB program, så er dets ikon stadig synlig i systray indtil musen føres henover. Så "opdateres" systray, og ikonet forsvinder.

Det er denne funktionalitet jeg mangler; at "opdatere" systray generelt.

/tjacob
Avatar billede joern Nybegynder
18. marts 2003 - 22:18 #5
Ok tjacob.

Har du bemærket denne note i hjælpen til 'shell': 
Note  The Shell function runs other programs asynchronously. This means that a program started with Shell might not finish executing before the statements following the Shell function are executed.

Jeg anvender shell en del steder i mine programmer, og kan se at det program der er startet via shell ikke lukker fordi værts-programmet afsluttes.
Det med handles ved jeg ikke meget om, men jeg starter altid shell med
x = shell(.....) så jeg får en værdi.  Dette har tidligere været diskuteret på 'Eksperten' om der var forskel på om man lod en variabel indeholde værdien.
Jeg bruger VB5 og dér anbefales denne notation.  Men strengt taget bruger jeg den ikke værdien videre frem.

Fra books online:

This example uses the Shell function to run an application specified by the user.
' Specifying 1 as the second argument opens the application in
' normal size and gives it the focus.
Dim RetVal
RetVal = Shell("C:\WINDOWS\CALC.EXE", 1)    ' Run Calculator.

En mulighed er at anvende shellexecute i stedet, se f. eks.:

http://www.ml-consult.demon.co.uk/foxst-26.htm

Håber nogle af de 'gode eksperter' kommer på banen, så dit problem bliver løst, jeg har ikke mere at tilbyde.

M.v.h.  Jørn
Avatar billede sjh Nybegynder
18. marts 2003 - 22:54 #6
Avatar billede tjacob Juniormester
18. marts 2003 - 23:46 #7
Jørn>>Jeg bruger ShellExecuteEx til at åbne med som i det eksempel du nævner, og det er netop for kunne gemme en ProcessID. Den kan jeg bruge senere med  diverse Process API'er til at lukke med.

sjh>>Kan jeg desværre ikke bruge. Det er ikke MIT prog der skal eller har oprettet en ikon. Det er den app jeg har åbnet med ShellExecuteEx. Jeg kan ikke fjerne et ikon med Shell_NotifyIcon, når jeg ikke har et handle til det (NOTIFYICONDATA).
Avatar billede joern Nybegynder
19. marts 2003 - 09:14 #8
Søgning på Google:  systray & update & vb    giver 1330 svar, her er et der godt nok handler om en animeret ikon i systray der kun skifter når musen holdes over den.  Men måske er der noget for 'en ekspert' at udlede?

http://www.experts-exchange.com/Programming/Programming_Languages/Visual_Basic/Q_10210520.html#1

Prøv selv den eller lign. søgning, (når det nu er så vigtigt med en hængende ikon).

M.v.h.  Jørn
Avatar billede tjacob Juniormester
20. marts 2003 - 05:34 #9
Du skal have mange tak for ihærdigheden Jørn. Den du henviser til gælder også for et program man selv har lavet. Det er fint nok, og jeg ved efterhånden en hel del om systray.
Det vigtige for mig er IKKE en hængende ikon, -Det er at FJERNE en hængende ikon.

Mit problem er, at den app jeg åbner med shell, efterlader en ikon siddende i systray. Den ønsker jeg at FJERNE når app'en er blevet lukket igen. Ellers ser det ud som om den stadig kører!
Og igen: Det er IKKE mit prog der efterlader dette ikon. Det er den app jeg åbner fra shell.

/tjacob
Avatar billede joern Nybegynder
20. marts 2003 - 08:39 #10
Hej tjacob.

Jeg er en af dem, der har forstået problemstillingen, men mit oprindelige bud var jo også, i den kaldte klient-applikation at fjerne, at der overhovedet KOM et ikon i SysTray.
Når klient-programmet lukkes fra din VB-applikation, må klienten opfatte det som 'abnormal termination'.  Det er ikke engang sikkert at en afbrydelse af tasken vil fjerne ikonet, simpelthen fordi SysTray ikke opdateres. 
Min idé med linket vedr. den animerede ikon er jo at se hvor i mandens kode der udføres opdatering af SysTray, - det du opnår ved at bevæge musen derind over.

Måske kunne du snyde SysTray ved med dit VB-program at positionere markøren i SysTray kortvarigt, og så tilbage hvor den kom fra.  Så skal du bare vide hvor brugeren HAR SysTray.  Folk kan jo finde på at have Proceslinien hele skærmen rundt.
Jeg personlig ville være ligeglad om der blev efterladt et ikon, eller også ville jeg i min VB applikation gøre opmærksom på at brugeren selv måtte afslutte klient-programmet på normal vis.
Dette er min sidste bemærkning i dette spørgsmål, da jeg jo ikke kender nogen løsning der lige dækker tjacob's krav.

M.v.h.  Jørn
Avatar billede tjacob Juniormester
20. marts 2003 - 15:00 #11
"Det er ikke engang sikkert at en afbrydelse af tasken vil fjerne ikonet, simpelthen fordi SysTray ikke opdateres."

Dette er sagens kerne. Det ER sikkert: -det gør den ikke.

Endnu en gang tak for indlægget, Jørn.
Jeg har forsøgt at 'snyde' systray ved selv at placere et ikon, og derefter fjerne det. Det virker fint; -Men det andet ikon er der stadig!
(Selvom det rent visuelt flyttes frem og tilbage).

Jeg har dog ikke prøvet at placere markøren i systray rent programmelt, så det vil jeg fluks gøre.
Men det ER jo noget rod med disse workarounds, selvom jeg synes man laver dem oftere og oftere.  ;-)

/tjacob
Avatar billede tjacob Juniormester
20. marts 2003 - 15:04 #12
Lige for klarhedens skyld:

Den app jeg åbner kan godt vises i et vindue. Når jeg lukker dette vindue (også rent programmelt),er der ingen problemer: Ikonet forsvinder.
Det er kun når vinduet er minimeret til systray (hvad det er 99%), at jeg har problemet med at fjerne ikonet ved nedlukning.
Avatar billede tjacob Juniormester
21. marts 2003 - 09:51 #13
Så har jeg forsøgt at placere musen, men det hjalp heller ikke. Der skal sikkert også genereres noget click event, men det kan jeg ikke rigtig finde noget materiale om.
Jeg har bestemt mig for at bruge en anden løsning, da det her er alt for besværligt, for blot at åbne et internet logon program. ;-)

Jørn, du får halv points for dine forslag.
Jeg fik ikke nogen løsning, men du har bestemt gjort en indsats.

/tjacob
Avatar billede joern Nybegynder
21. marts 2003 - 11:48 #14
Hej.

Tak for point.  Jeg syntes jo fra begyndelsen at det var et 'luksusproblem', men selvfølgelig - brugere kan blive forvirrede over det mindste.

Det med at ikonet fra det lukkede program kunne fjernes med bevægelse af markøren i SysTray, skulle den ikke netop bevæges over det formastelige ikon?  Det var ikke nok at SysTray som sådan blev opdateret?  Nå, sagen er slut, videre med den næste.

God Weekend  M.v.h.  Jørn
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB

Riskpoint A/S (Riskpoint Solutions Limited)

Senior Developer

Politiets Efterretningstjeneste

PET søger softwareingeniører til Ruslandsområdet

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Cyberdivisionen søger analytisk stærk og erfaren medarbejder i Hvidovre

Netcompany A/S

Linux Operations Engineer