vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Erstellen von dynamischen Kontextmen?s - wann immer Sie sie brauchen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Alle Fenster auflisten, die mit TEXT beginnen 
Autor: M$
Datum: 14.08.06 18:31

Hallo,

ich suche einen möglichst kurzen Code, um in einer Listbox alle Fenster aufzulisten, die mit TEXT beginnen. Beispielsweise alle Fenster die mit "vb@archiv Foren - " beginnen.
Beim Klick auf einen Button soll das Fenster dann in den Vordergrund gerufen werden.

Mac
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Alle Fenster auflisten, die mit TEXT beginnen 
Autor: Visual Basic Fan
Datum: 14.08.06 18:38

Dim str As String = Form.Name ' Das ganze muss in eine Schleife
If str.StartsWith("vb@archiv Foren ") Then
lst.Items.Add("vb@archiv Foren") ' Vielleicht musst Du das noch ein wenig 
' erweitern.
End If

MfG
Visual Studio .Net Team Suite 2008 - Meine neue lieblings IDE

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Alle Fenster auflisten, die mit TEXT beginnen 
Autor: M$
Datum: 14.08.06 18:42

Hm. ..

Fehler 1
Der Verweis auf einen nicht freigegebenen Member erfordert einen Objektverweis. C:\Dokumente und Einstellungen\SP\Lokale Einstellungen\Anwendungsdaten\Temporary Projects\TestApp\Form1.vb 2 25 TestApp


Sorry, aber ich bin wirklich noch nicht gut im Programmieren.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Alle Fenster auflisten, die mit TEXT beginnen 
Autor: Visual Basic Fan
Datum: 14.08.06 18:44

Kein Problem, der Code war aus der Hand geschrieben. Ich gucke gerade einmal wie es richtig geht. Einen Moment.

MfG
Visual Studio .Net Team Suite 2008 - Meine neue lieblings IDE

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Code posten 
Autor: Visual Basic Fan
Datum: 14.08.06 18:45

Post einmal ein wenig von deinem Code. Das hilft!!!

MfG
Visual Studio .Net Team Suite 2008 - Meine neue lieblings IDE

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Alle Fenster auflisten, die mit TEXT beginnen 
Autor: Visual Basic Fan
Datum: 14.08.06 18:49

If Me.Text.StartsWith("F") Then
            lst.Items.Add(Me.Text)
        End If
Bis gleich...

MfG
Visual Studio .Net Team Suite 2008 - Meine neue lieblings IDE

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Code posten 
Autor: M$
Datum: 14.08.06 18:50

Wie meinst du, von meinem Code?
Ich habe noch keinen ganzen Code, das ganze soll nur zum lernen werden.


(Ich arbeite nach dem Motto: Erst denken (oder andere fragen ;) und dann arbeiten. Hilft manchmal weiter)Visual Basic Fan schrieb:
Zitat:

Post einmal ein wenig von deinem Code. Das
hilft!!!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Alle Fenster auflisten, die mit TEXT beginnen 
Autor: M$
Datum: 14.08.06 18:52

Hm ... ne, geht nicht ... mich irritiert das "Me" ein bisschen. Ich möchte ja nicht nur aus dem Programm die Fesnter, sondern von allen Programmen (beispielsweise vom Firefox)
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Alle Fenster auflisten, die mit TEXT beginnen 
Autor: Visual Basic Fan
Datum: 14.08.06 19:49

Ups, dass wird schwer. Dann würde ich das ganze nach Prozessnamen machen. Sonst wird das relativ schwer.

MfG
Visual Studio .Net Team Suite 2008 - Meine neue lieblings IDE

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Alle Fenster auflisten, die mit TEXT beginnen 
Autor: M$
Datum: 14.08.06 19:54

Aber es soll ja nicht auf einen Prozess festgelegt sein.
Beipsiel:

Ein Internet Explorer-Fenster, Titel "TEXT - Internet Explorer"
Ein Firefox-Fenster, Titel "TEXT - Seite 2 - Mozilla Firefox"
Ein ICQ-Fenster, Titel "Text - Nachrichtensitzung"

Nur ein beispiel. Und in der Listbox soll dann stehen

TEXT - Internet Explorer
TEXT - Seite 2 - Mozilla Firefox
TEXT - Nachrichtensitzung

(Das IE und FF nur, weil die Fenster von den Brwosern ja so enden.)
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Alle Fenster auflisten, die mit TEXT beginnen 
Autor: Drapondur
Datum: 14.08.06 20:32

Hi,

hier gibt's Code (der für einen Anfänger vllt ein bißchen schwierig ein dürfte)
Imports System.Runtime.InteropServices
 
Public Class Form1
 
#Region "Api-Deklarationen"
    Private Delegate Function EnumWindowsProcDele( _
            ByVal hwnd As IntPtr, _
            ByVal lParam As IntPtr) As Boolean
 
    Private Declare Function EnumWindows Lib "user32.dll" ( _
      ByVal lpEnumFunc As EnumWindowsProcDele, _
      ByVal lParam As IntPtr) As Boolean
 
    Private Declare Function GetDesktopWindow Lib "user32.dll" () As IntPtr
 
    Private Declare Function GetWindowText Lib "user32.dll" Alias _
      "GetWindowTextA" ( _
      ByVal hwnd As IntPtr, _
      ByVal lpString As System.Text.StringBuilder, _
      ByVal cch As Int32) As Int32
 
    Private Declare Function GetWindowTextLength Lib "user32.dll" Alias _
      "GetWindowTextLengthA" ( _
      ByVal hwnd As IntPtr) As Int32
 
#End Region
 
    'Klasse, um sich Infos zu Fenstern zu merken
    Private Class EnumWindowsInfo
        Public Match As String          'Gibt an, welche Fenster gefunden 
        ' werden sollen
        Public [Handles] As IntPtr()    'Gibt die Handles der Fenster zurück
        Public Text As String()         'Gibt den Titel der Fenster zurück
    End Class
 
    Private Sub cmdFindWindows_Click(ByVal sender As System.Object, ByVal e As _
      System.EventArgs) _
        Handles cmdFindWindows.Click
        Try
            'Neue Info-Klasse machen
            Dim info As New EnumWindowsInfo
            '...und Member initialisieren
            info.Handles = New IntPtr() {}
            info.Match = "F*"
            info.Text = New String() {}
            'Die Klasse pinnen, damit sie vom GC nicht verschoben wird
            Dim gch As GCHandle = GCHandle.Alloc(info, GCHandleType.Normal)
            Try
                'Das GCHandle als IntPtr holen, weil die API-Funktion das 
                ' braucht
                Dim lParam As IntPtr = GCHandle.ToIntPtr(gch)
                Dim d As New EnumWindowsProcDele(AddressOf EnumWindowsProc)
                Dim hwndDeskTop As IntPtr = GetDesktopWindow
                'Fenster enummerieren lassen
                EnumWindows(d, lParam)
 
                Debug.WriteLine("ERGEBNIS:")
                For idx As Integer = 0 To info.Handles.Length - 1
                    Debug.WriteLine("Fensterhandle: " & info.Handles( _
                      idx).ToString & _
                                    "; Text: " & info.Text(idx))
                Next
            Catch ex As Exception
                Debug.WriteLine(ex.ToString)
            Finally
                gch.Free()
            End Try
 
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub
 
    Private Function EnumWindowsProc(ByVal hwnd As IntPtr, ByVal lParam As _
      IntPtr) As Boolean
        Try
            Debug.Write("In EnumWindowsProc ")
            Dim ret As Integer
            'Die Länge des Fenstertitels holen
            ret = GetWindowTextLength(hwnd)
            If ret > 0 Then
                'Den Titeltext des Fensters holen
                Dim sb As New System.Text.StringBuilder(ret)
                ret = GetWindowText(hwnd, sb, ret)
                Dim txt As String = sb.ToString
                'Das GCHandle zurückholen 
                Dim gch As GCHandle = GCHandle.FromIntPtr(lParam)
                'Jetzt das im GCHandle allozierte Objekt holen
                Dim info As EnumWindowsInfo = CType(gch.Target, EnumWindowsInfo)
 
                Debug.WriteLine("Fenster mit Text " & txt)
                'Vergleich, ob der Text dem Gesuchten entspricht und ggf. merken
                If txt Like info.Match Then
                    ReDim Preserve info.Handles(info.Handles.Length)
                    info.Handles(info.Handles.Length - 1) = hwnd
                    ReDim Preserve info.Text(info.Text.Length)
                    info.Text(info.Text.Length - 1) = txt
                End If
            Else
                Debug.WriteLine("Fenster ohne Text")
            End If
            Return True
        Catch ex As Exception
            Debug.WriteLine(ex.ToString)
        End Try
    End Function
End Class
Ciao
D.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Alle Fenster auflisten, die mit TEXT beginnen 
Autor: M$
Datum: 14.08.06 20:42

Oh ja, ziemlich schwer sogar. Ghet das nicht Einfacher?
Geht das wirklich nicht kürzer bzw. einfacher? Sowas wie Handles brauche ich doch garnicht.

Weil ich glaube, bei dem Code wäre der Lerneffekt bei mir nicht wirklich gross, da ich nichtmal die Hälfte verstehe.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Alle Fenster auflisten, die mit TEXT beginnen 
Autor: Drapondur
Datum: 14.08.06 21:04

Hallo,

ja doch, es gibt noch eine etwas leichtere Variante. Daran habe ich nicht sofort gedacht, sonst hätte ich die gleich genommen. Allerdings kommst Du auch da nicht ohne Handles aus:
Public Class Form2
    Private Declare Function FindWindowEx Lib "user32.dll" Alias _
      "FindWindowExA" ( _
      ByVal hwndParent As IntPtr, _
      ByVal hwndChildAfter As IntPtr, _
      ByVal lpszClass As String, _
      ByVal lpszWindow As String) As IntPtr
 
    Private Declare Function GetDesktopWindow Lib "user32.dll" () As IntPtr
 
    Private Declare Function GetWindowText Lib "user32.dll" Alias _
      "GetWindowTextA" ( _
      ByVal hwnd As IntPtr, _
      ByVal lpString As System.Text.StringBuilder, _
      ByVal cch As Int32) As Int32
 
    Private Declare Function GetWindowTextLength Lib "user32.dll" Alias _
      "GetWindowTextLengthA" ( _
      ByVal hwnd As IntPtr) As Int32
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _
      System.EventArgs) Handles Button1.Click
        Try
            Dim allTitel As New Specialized.StringCollection
 
            Dim hwndDesktop As IntPtr = GetDesktopWindow
            Dim hwndChild As IntPtr = IntPtr.Zero
            Do
                hwndChild = FindWindowEx(hwndDesktop, hwndChild, vbNullString, _
                  vbNullString)
                Dim ret As Integer
                'Die Länge des Fenstertitels holen
                ret = GetWindowTextLength(hwndChild)
                If ret > 0 Then
                    'Den Titeltext des Fensters holen
                    Dim sb As New System.Text.StringBuilder(ret)
                    ret = GetWindowText(hwndChild, sb, ret)
                    Dim txt As String = sb.ToString
                    Debug.WriteLine("Fenster mit Text " & txt)
                    'Vergleich, ob der Text dem Gesuchten entspricht und ggf. 
                    ' merken
                    If txt Like "F*" Then
                        Debug.WriteLine("GEFUNDEN: " & txt)
                        allTitel.Add(txt)
                    End If
                Else
                    Debug.WriteLine("Fenster ohne Text")
                End If
            Loop Until hwndChild.Equals(IntPtr.Zero)
 
            Debug.WriteLine("ERGEBNIS:")
            For Each titel As String In allTitel
                Debug.WriteLine(titel)
            Next
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub
End Class
Ciao
D.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Alle Fenster auflisten, die mit TEXT beginnen 
Autor: M$
Datum: 14.08.06 21:28

Also, ich hab' rumgebastelt, und so geht das:

        Dim hwndDesktop As IntPtr = GetDesktopWindow
        Dim hwndChild As IntPtr = IntPtr.Zero
        Do
            hwndChild = FindWindowEx(hwndDesktop, hwndChild, vbNullString, _
              vbNullString)
            Dim ret As Integer
 
            ret = GetWindowTextLength(hwndChild) + 1
 
            'Den Titeltext des Fensters holen
            Dim sb As New System.Text.StringBuilder(ret)
            ret = GetWindowText(hwndChild, sb, ret)
            Dim txt As String = sb.ToString
 
            'Vergleich, ob der Text dem Gesuchten entspricht und ggf. merken
            If txt.StartsWith(" TEXT:") Then
                ListBox1.Items.Add(txt.TrimStart)
 
            End If
        Loop Until hwndChild.Equals(IntPtr.Zero)
Aber es wäre nett, wenn mir das trotzdem nochmal jemand erklären könnte, weil ich habe zum Beispiel keine Ahnung wozu die hwndDesktop & hwndChild etc. da sind.
Und was genau ist "ret"?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Alle Fenster auflisten, die mit TEXT beginnen 
Autor: M$
Datum: 14.08.06 21:29

Ach ja, ist das bei Java-Fenstern normal, dass diese ein Leerzeichen am Anfang haben?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Alle Fenster auflisten, die mit TEXT beginnen 
Autor: Iced-T
Datum: 14.08.06 22:20

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _
      System.EventArgs) Handles MyBase.Load
        For Each p As Process In Process.GetProcesses
            If p.MainWindowTitle.StartsWith("T") = True Or _
              p.MainWindowTitle.StartsWith("S") = True Then
                ListBox1.Items.Add(p.ProcessName)
            End If
        Next p
    End Sub
0
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Alle Fenster auflisten, die mit TEXT beginnen 
Autor: M$
Datum: 14.08.06 22:57

Iced-T? Ich bin dir soooo dankbar! So schön kurz, und sogar verständlich! Danke!

Danke natürlich auch an die anderen!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Alle Fenster auflisten, die mit TEXT beginnen 
Autor: Iced-T
Datum: 15.08.06 01:10

kein problem, gern geschehen
0
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Alle Fenster auflisten, die mit TEXT beginnen 
Autor: M$
Datum: 15.08.06 09:57

Also, ich habe das jetzt mal getestet, funktioniert auch ganz gut. Nur wenn ich das Fenster TEXT minimiere und in der Taskleiste ein anderes in den Vordergrund rufe, dann geht es nicht.

Also: Manchmal geht es, manchmal nicht.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Alle Fenster auflisten, die mit TEXT beginnen 
Autor: WmS
Datum: 15.08.06 13:49

ich hab es jetzt ein paar mal durchlaufen lassen und jedesmal wurden alle fenster aufgelistet, ob nun minimiert, maximiert und was was gemiert :
        For Each p As Process In Process.GetProcesses
            Console.WriteLine(p.MainWindowTitle)
        Next
cu, Lukas

#######
ICQ: 192-576-074
http://codinglukas.co.funpic.de/

Wer fragt ist ein Narr - f?r 5 Minuten.
Wer nicht fragt ist ein Narr - sein Leben lang.
Quarks&Co

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Alle Fenster auflisten, die mit TEXT beginnen 
Autor: Drapondur
Datum: 15.08.06 14:39

So ist's natülich viel besser.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Alle Fenster auflisten, die mit TEXT beginnen 
Autor: M$
Datum: 15.08.06 15:57

Könnte das vielleicht daran liegen, dass die Fenster unter anderem Java-Fenster sind?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Alle Fenster auflisten, die mit TEXT beginnen 
Autor: M$
Datum: 18.10.06 13:02

So,
ich bins nochmal.

Aber was ist, wenn das nicht der "MainWindowTitle" ist.
Weil ein Programm von mir ruft ein neues Form auf, indem sich ein Javaapplet über den Webbrowser dargestellt wird. Darüber wird ein neues Fenster aufgerufen.
Und dieses findet sich dann leider nicht in der Liste MacPri schrieb:
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel