Alle offenen Fenster schliessen

Da es sich um ein fremdes Programm handelt, könntest Du, wie von flyandshot oben erwähnt, die Taskkill-Methode anwenden. Ist aber, wie er schon sagte, wirklich ziemlich heftig...

Grüsse
ronaldh
 
Es gibt aber auch eine API-Funktion TerminateProcess, mit der Du andere Anwendungen beenden kannst.

Grüsse
ronaldh
 
Das Problem ist ja, das die Dlls vom Hauptprogramm aufgerufen werden, wenn ich als ctrl + alt + del drücke, erscheint nur das Hauptprogramm, meine Fenster werden gar nicht als Tasks behandelt, oder seh ich das falsch? Ich hab den ApiViewer 2004 runtergeladen, scheint laut diesem tatsächlich kein Fensterkiller zu geben. Schade.
 
Dass man einzelne DLL's killen kann, kann ich mir nur schwer vorstellen, da man damit ja möglicherweise einem Programm den Boden unter den füssen weg zieht.

Die einzelnen Prozesse, die aktiv sind, kannst Du Dir mit folgender Funktion ansehen:

Code:
Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lparam As Long) As Boolean
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Public Function EnumWindowsProc(ByVal hwnd As Long, ByVal lparam As Long) As Boolean
    Dim sSave As String, ret As Long
    'frmWinList.List1.Clear
    ret = GetWindowTextLength(hwnd)
    sSave = Space(ret)
    GetWindowText hwnd, sSave, ret + 1
    'frmWinList.List1.AddItem Str$(hwnd) + " " + sSave
    If sSave <> "" Then
      frmWinList.List1.AddItem sSave
   End If
    'continue enumeration
    EnumWindowsProc = True
End Function



Public Sub ShowPrograms(Finm As String) 
   Dim iSu As Long
   frmWinList.AutoRedraw = True
   frmWinList.List1.Clear
   EnumWindows AddressOf EnumWindowsProc, ByVal 0&
   For iSu = 0 To frmWinList.List1.ListCount - 1
      frmWinList.List1.ListIndex = iSu
   Next
End Sub

Dazu habe ich mir eine Form "frmWinList" gemacht, mit einer Listbox drauf.

Der normale Windows-Taskmanager (Ctrl-Alt-Del) zeigt bei weitem nicht alles was läuft. Da ist der Process Explorer von Syinternals besser.

Vielleicht hilft Dir das ja weiter!

Grüsse
ronaldh
 
Hm, ich versuchs mal zu erkläre, falls ich irgendwo einen Mist sage, einfach korrigieren bitte:
1. Hauptprogramm wird geöffnet --> Ist ein Prozess, der bleibt.
2. Fenster von mir, die als Schnittstelle dazu programmiert wurden, werden geöffnet --> Kein Prozess, nur Fenster.
3. Mittels Fenster können verschiedene Arbeiten erledigt werden --> nicht relevant.
4. Da die Fenster nicht modal sind, kann das Hauptprogramm, während meine Fenster offen sind, geschlossen werden.
5. Bei diesem Fall erscheint der Standard-Fehler, dass das Hauptprogramm nicht reagiert.

Dies erscheint nur bei einem Fenster, weswegen ich dieses also schliessen möchte, bevor das Hauptprogramm geschlossen wird.
Falls ich dies bewerkstelligen könnte, würde das auch gleich ein anderes Problem lösen, nämlich, dass alle Fenster schliessen, wenn der User umloggt.
hWnd kann über den Fensternamen, der konstant ist, ermittelt werden.
Da dieses Fenster kein Task ist, kann ichs es nicht mit Taskkill etc. beenden.
CloseWindow minimiert das Fenster nur, was nichts hilft, denn der Fehler erscheint weiter.

Ich hoffe, ich konnte das Problem hinreichend erklären, kurz gesagt.
Prozess killen hilft nicht.
Fenster minimieren hilft nicht.
Die erfoderlichen Werte sind da nur die Funktion, um ein Fenster zu schliessen, fehlt.

Wer Rechtschreibefehler findet, darf sie behalten.
 
Du rufst Deine Fenster aber aus dem Hauptprogramm heraus auf, oder verstehe ich das falsch?

Wenn dies so ist, dann kannst Du doch im Form_Unload-Ereignis des Hauptprogrammes die gegebenenfalls geöffneten Fesnter schliessen (das hatte ich ja weiter oben geschildert).

Oder rufst Du Deine Fenster mit einem ganz anderen Programm auf? In diesem Fall könntest Du in diesem Programm einen Timer einbauen, der in regelmäßigen Abständen guckt, ob das Hauptprogramm noch da ist, und wenn nicht, alle abhängigen Prozesse schließt. Das kannst Du natürlich auch auf jedem Fenster separat tun, hängt davon ab, wie die Fenster in Zusammenhang stehen.

Grüsse
ronaldh
 
Da sowohl das Hauptorgramm sowie meines aus mehreren Dlls besteht, sind nur die beiden Verbindungs-Dlls miteinander verknüft, ausserdem kann ich in das Hauptprogramm nicht direkt reinprogrammieren, ich bekomme lediglich Events, einer davon ist eben BeforeProgrammClose.

Das mit dem Forms.Counter funktioniert deswegen nicht, weil beim Schliessen ja die DDL des Hauptprogramms geladen wird und Forms zählt nur die Fenster des eben geladenen Dlls soviel ich weiss.
 
Jetzt bin ich ein wenig verwirrt.

Das mit dem Forms.Counter funktioniert deswegen nicht, weil beim Schliessen ja die DDL des Hauptprogramms geladen wird

Wenn das Hauptprogramm geschlossen wird, läd es eine DLL?

Wie auch immer: Du willst doch Deine Anwendung schliessen, falls das Hauptprogramm geschlossen wurde. Die Existenz des geöffneten Hauptprogramms kannst Du doch abprüfen.

Wenn Du dies in einem Timer regelmäßig machst, müsstest Du doch Deine Applikation schliessen können! Oder vestehe ich da was vollkommen falsch?

Grüsse
ronaldh
 
Das ganze Problem ist: Wie schliesse ich ein Fenster (nicht minimieren, schliessen) über eine API-Funktion. Nur Fenster, weder Task noch Thread, nur Fenster, aber das scheints laut ApiViewer gar net zu geben, oder ich bin ein schlechter Sucher, was auch möglich ist. :)
 

Neue Beiträge

Zurück