Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0217: Fremde Fenster schließen

 von 

Beschreibung 

Hiermit können alle Fenster mit einem frei wählbaren Wort in der Titelzeile gefunden und allesamt geschlossen werden.

Update von Konrad Doblander: Das Fenster wird nun mithilfe von SendMessage geschlossen.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

GetWindow, GetWindowTextA (GetWindowText), GetWindowTextLengthA (GetWindowTextLength), SendMessageA (SendMessage)

Download:

Download des Beispielprojektes [2,33 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Project1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Listen-Steuerelement "List1"
' Steuerelement: Textfeld "Text1"
' Steuerelement: Schaltfläche "Command2"
' Steuerelement: Schaltfläche "Command1"
' Steuerelement: Beschriftungsfeld "Label1"

Option Explicit

Private Declare Function GetWindow Lib "user32" (ByVal hwnd _
        As Long, ByVal wCmd As Long) As Long
               
Private Declare Function GetWindowTextLength Lib "user32" _
        Alias "GetWindowTextLengthA" (ByVal hwnd As Long) _
        As Long
        
Private Declare Function GetWindowText Lib "user32" Alias _
        "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString _
        As String, ByVal cch As Long) As Long
        
Private Declare Function SendMessage Lib "user32.dll" Alias _
        "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
        ByVal wParam As Long, lParam As Any) As Long

Const GW_HWNDFIRST = 0
Const GW_HWNDNEXT = 2
Const WM_CLOSE = &H10

Private Sub Command1_Click()
    Call EnumWindows
End Sub

Private Sub EnumWindows()
    Dim hwnd&, Result&, Title$
    
    List1.Clear
    hwnd = GetWindow(Me.hwnd, GW_HWNDFIRST)
    
    Do
        Result = GetWindowTextLength(hwnd) + 1
        Title = Space$(Result)
        Result = GetWindowText(hwnd, Title, Result)
        Title = Left$(Title, Len(Title) - 1)
        
        If InStr(1, Title, Text1.Text) Then
            List1.AddItem Title
            List1.ItemData(List1.NewIndex) = hwnd
        End If
    
        hwnd = GetWindow(hwnd, GW_HWNDNEXT)
    Loop Until hwnd = 0
    
    If List1.ListCount > 0 Then
        Command2.Enabled = True
    Else
        Command2.Enabled = False
    End If
End Sub

Private Sub Command2_Click()
    Dim x&, y&, hwnd&
    
    x = List1.ListCount
    If x > 0 Then
      For y = 0 To x - 1
       hwnd = List1.ItemData(y)
       If hwnd = Me.hwnd Then MsgBox ("Nagut, wie gewünscht!")
       SendMessage hwnd, WM_CLOSE, ByVal 0&, ByVal 0&
      Next y
    End If
    Command2.Enabled = False
End Sub

Private Sub Form_Load()
    Command2.Enabled = False
End Sub
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 13 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von blackbyte am 05.10.2004 um 20:52

Bei mir(Win98) funkt der code.
Nur bei Word, excel... habe ich das Problem dass die Speichernfrage kommt und das prog hängt so lang bis ich ja od. nein klicke, kann man das ungehen?

Kommentar von byte2702 am 05.09.2004 um 15:23

Hallo,

Code funktioniert bei mir unter XP (VB6) auch nicht.

Habe daher nun, unter Anraten der MSDN Library von Microsoft, folgende Möglichkeit probiert:

Anstelle von:
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Verwende ich:
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Anstelle des Befehls "SendMessage hwnd, WM_CLOSE, ByVal 0&, ByVal 0&" muss dann natürlich "PostMessage hwnd, WM_CLOSE, ByVal 0&, ByVal 0&" im Code (Sub-Prozedur Command2_Click()) stehen. Der Rest muss nicht verändert werden.

Hinweis für WM_QUIT: WM_QUIT (&H12) sollte laut Microsoft nicht mit PostMessage verwendet werden, sondern mit PostQuitMessage (siehe Online MSDN Library für VB6).

Habe den Code zwar abgewandelt verwendet, aber dort funktioniert es unter XP mit "PostMessage".

Kommentar von kosch am 20.07.2004 um 11:59

Kann man den Code auch von einem Word-Macro aus aufrufen?

...oder direkt darin ausführen?

Kommentar von Fenek am 15.06.2003 um 11:54

Ich kann Hans Kurr nur Zustimmen, nachdem ich bei mir VB6 & XP im beim Tip angegebenen Code anstelle der Hex Zahlen die Werte als Dezimal hingeschrieben habe leuft alles Perfekt ?!?!

Kommentar von KonraD am 13.06.2003 um 22:39

Folgender Code fubnktioniert auch unter Win2000 und WinXP -

' Fenster schliessen
Public Function WinClose(ByRef xhWnd As Long) As Boolean
Dim rApi As Long
'
rApi = SendMessage(xhWnd, WM_CLOSE, ByVal 0&, ByVal 0&)
WinClose = (rApi > 0) ' Rückgabewert (True wenn erfolgreich!)(0=Fehler)
End Function

Kommentar von Money4all am 02.01.2003 um 21:54

Habe mal eine Frage. Bei mir kommt immer "Internet Explorer-Skriptfehler". Denn kann ich mir auch mit dem Programm anzeigen lassen. Aber ich würde den gern auch damit schließen können. Aber das geht nicht. Alle anderen Sachen kann ich schließen nur das nicht ;(

Kommentar von Rolf Appelt am 09.10.2002 um 16:32

Funktioniert bei mir (NT4, VB6) nur für die Applikation selbst (Form1). Allerdings auch nur, wenn man statt dem Titel das Handle zur Liste hizufügt, was (mir) irgendwie auch logisch erscheint. Kennt jemand eine komplette und schnell verfügbare Referenz auf die Konstanten von SendNotifyMesseg in VB?

Kommentar von Horst Düvel am 26.08.2002 um 15:16

Bei mir (unter XP)
arbeitet das Programm
schon mit dem vorgegebenen "Explorer" nicht.
Es passiert einfach nix.
D.h. der Button zum
Schließen des Fremdprogramms wird
nicht mal aktiviert!
Gruss Horst

Kommentar von CHar am 25.08.2002 um 21:33

Also bei mir (XP mit vb6) funzt es zB beim Rambooster NUR mit 61536! das mit -4000 hab ich auch.

Kommentar von Fabse am 17.08.2002 um 14:43

Hallo!
Ist wahrscheinlich wieder eine Noob frage aber egal.
Ich habe die Buttons ins das Projekt eingefügt und die Listbox aber trotzdem funktioniert es nicht. Habe Win2000 VS 6.0 hmmm bitte um Hilfe.
MFG,
Fabse

Kommentar von Christian Mies am 04.08.2002 um 17:47

Kann man das Program auch so ändern das die URL ausgelesen wird? Und dann in die Liste geschrieben wird? Garnicht erst der Titel.

Kommentar von Hans Kurr am 11.12.2001 um 14:20

BS: W2K
die "Const SC_CLOSE = &HF060" wird bei mir der Konstantenwert dezimal als -4000 aufgelöst. Somit funktioniert nix. Abhilfe: Den Konstantenwert dezimal eintragen: "Const SC_CLOSE = 61536" und schon klappts!
Scheinbar setzt w2K die Hexzahl falsch um.
Warum auch immer.- Oder mache ich was falsch?

Kommentar von Michael Gubitz am 12.01.2001 um 15:16

Der Tipp fkt. mit einigen Programmen nicht - speziell das Beenden (z.B. Winword 2000,Word Viewer 97, Outlook 2000)!
Excel 2000 hingegen fkt. problemlos???