| |
VB.NET - Ein- und UmsteigerAlle 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 | |
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. | |
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!!!
| |
| |
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) | |
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.) | |
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. | |
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. | |
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. | |
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"? | |
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? | |
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 | |
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! | |
Re: Alle Fenster auflisten, die mit TEXT beginnen | | | Autor: Iced-T | Datum: 15.08.06 01:10 |
| kein problem, gern geschehen 0 | |
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. | |
Re: Alle Fenster auflisten, die mit TEXT beginnen | | | Autor: Drapondur | Datum: 15.08.06 14:39 |
| So ist's natülich viel besser. | |
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? | |
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: | |
| 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 |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats Neu! sevDTA 3.0 Pro
SEPA mit Kontonummernprüfung
Erstellen von SEPA-Dateien mit integriertem BIC-Verzeichnis und Konto- nummern-Prüfverfahren, so dass ungültige Bankdaten bereits im Vorfeld ermittelt werden können. Weitere Infos
|