Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

Afsluiten van applicatie in systemtray

Pagina: 1
Acties:

  • doskabouter
  • Registratie: Oktober 2004
  • Laatst online: 17:40
Hoi,

Ik ben aan het proberen om een applicatie die in in de systemtray staat softwarematig af te sluiten, maar ik kom er niet helemaal uit.

Al flink wat rond gegoogled, en daar gevonden dat het process niet reageert op Close() of CloseMainWindow(), maar dingen die wel werken heb ik nog niet gezien.

Ik wil vooralsnog niet terug hoeven vallen op de Process.Kill(), dus ben nog op zoek naar andere mogelijkheden.

Ook al verschillende messages geprobeerd te sturen (WM_Close,WM_Quit) waar ook geen reactie op kwam.
Ook WM_RBUTTONDOWN,WM_KEYDOWN geprobeerd (ik dacht, misschien kan ik via wat muiskliks of keypresses de app wel afsluiten), maar ook daar kwam geen zichtbare reactie op.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
IntPtr hWnd = FindWindow("Shell_TrayWnd", null);
if (hWnd != null)
{
    hWnd = FindWindowEx(hWnd, IntPtr.Zero, "TrayNotifyWnd", null);
    if (hWnd != null)
    {
        hWnd = FindWindowEx(hWnd, IntPtr.Zero, "SysPager", null);
        if (hWnd != null)
        {
            hWnd = FindWindowEx(hWnd, IntPtr.Zero, "ToolbarWindow32", null);
            IntPtr cnt = SendMessage(hWnd, TB_BUTTONCOUNT, IntPtr.Zero, IntPtr.Zero);
            int processId;
            GetWindowThreadProcessId(hWnd, out processId);
            Process proc = Process.GetProcessById(processId);
            proc.Close();
            proc.CloseMainWindow();
            SendMessage(hWnd, WM_CLOSE,0,0);        
        }
    }
}


Iemand enig idee of er nog andere mogelijkheden zijn?

P.S. het moet onder Vista 32bits gaan draaien

Het grote voordeel van windows is dat je meer dos-boxen kan openen


  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 24-11 18:49
Processen die minized / iconized draaien hebben niet noodzakelijk een main window handle. Het kan zo zijn dat deze pas aangemaakt wordt zodra er éénmaal een main window open gemaakt is. Voor processen die in het notification area draaien kan het zelfs zo zijn dat er nooit een main window handle gemaakt wordt, omdat er alleen van een right-click contextmenu gebruik gemaakt wordt. Eerste stap is dus: controleer of de handle die je op regel 10 opvraagt überhaupt een geldige handle is en niet null is.


Trouwens; het is sowieso een erg slecht idee om een proces buiten de normale wegen af te sluiten. Dat zou je nooit mogen doen, tenzij je er 100% van zeker bent dat de threads binnen het proces in een staat zijn waar dit geen problemen gaat geven. Microsoft zelf adviseert om voor dit soort scenario's een private message tussen twee processen te sturen om het afsluiten correct aan te sturen. Daarvoor moet je echter wel de code voor beide applicaties kunnen aanpassen, dus het kan zijn dat dit geen optie voor je is.

MSDN: Terminating a Process


Het volgende heeft weliswaar betrekking op C#, maar het gaat om dezelfde principes. Misschien dat je er iets aan hebt: http://stackoverflow.com/...ized-process-from-c-sharp

[ Voor 8% gewijzigd door R4gnax op 29-12-2011 20:43 ]


  • doskabouter
  • Registratie: Oktober 2004
  • Laatst online: 17:40
De controle op null-heid had in ik mn complete sources wel gedaan, maar is er tijdens het copieren tussenuit gevallen :+

Die 2 urls die je aanhaalt had ik zelf ook al gebruikt voor inspiratie (vandaar de pogingen tot wm_close en wm_quit).

Ik heb helaas geen controle over het te sluiten programma, had al een bug-reportje richting makers gedaan, maar totdat zij een update klaar hebben (ervaring uit het verleden leert dat dat best wel eens kan duren) wil ik toch een redelijk werkbare situatie creeren.

Misschien als ik het programma zelf opstart met een Process.Start, zou ik dan wat meer mogelijkheden hebben om het af te sluiten?

Het grote voordeel van windows is dat je meer dos-boxen kan openen


  • pedorus
  • Registratie: Januari 2008
  • Niet online
Even gekeken met spy++, "ToolbarWindow32" is een window van Explorer die je nu probeert af te sluiten? Volgens mij ontbreekt er een stukje code van het opzoeken van de juiste knop, en het openen van een menu en op sluiten drukken bijvoorbeeld. ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • doskabouter
  • Registratie: Oktober 2004
  • Laatst online: 17:40
Crap. dat heb je met die experimenten:

Er zat nog een loopje over de buttons in de toolbar tussen.

Ik ga intussen eens even wat bezemen om tot een bare minimum te komen, en dan nog eens wat messages die kant op schoppen

Edit: Zo, even wat puin geruimd.

Ik had ergens wat code gevonden om de handles van de windows van de toolbar buttons op te vragen (via SendMessage(hToolbar, TB.GETBUTTON) ), en het lijkt de geldige handle te zijn:
(ShowWindow(ipWindowHandle, SW.SHOW); opent inderdaad het goede programma).

Echter DestroyWindow(ipWindowHandle): geen effect
SendMessage Quit/Close/KeyDown/KeyUp/LButtonDown/RButtonDown: ook geen effect

[ Voor 48% gewijzigd door doskabouter op 29-12-2011 22:12 ]

Het grote voordeel van windows is dat je meer dos-boxen kan openen


  • pedorus
  • Registratie: Januari 2008
  • Niet online
http://stackoverflow.com/...fully-terminate-a-process
http://stackoverflow.com/...imized-to-the-system-tray

Maar ik zie dat je al een close en zelfs een quit (naar thread of window?) stuurt. Destroy is natuurlijk niet de bedoeling. Is er een manier om deze applicatie handmatig af te sluiten? Kijk eens met iets als spy++ welke messages daarbij worden gebruikt en/of welke hwnds er beschikbaar zijn.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • doskabouter
  • Registratie: Oktober 2004
  • Laatst online: 17:40
Ik was inderdaad al wat met spy++ aan het prullen.

Als ik hem met de hand afsluit (r. mouse op de button, en dan in het pop-up menu "Exit" kiezen) dan zie ik de initiele mouseclick wel voorbijkomen, maar volgens mij wordt er een nieuw window aangemaakt (popup). Van dat window zou ik dan de handle op moeten vragen, daar de "exit" van zoeken, en daar een mousedown naar toe sturen.

Het is alleen erg lastig debuggen/testen, want zo gauw een ander programma focus krijgt, verdwijnt die popup weer...

Het grote voordeel van windows is dat je meer dos-boxen kan openen

Pagina: 1