VB 5/6-Tipp 0217: Fremde Fenster schließen
von ActiveVB
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: | Verwendete API-Aufrufe: GetWindow, GetWindowTextA (GetWindowText), GetWindowTextLengthA (GetWindowTextLength), SendMessageA (SendMessage) | Download: |
'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-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | |||||||
VB5 | |||||||
VB6 |
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???