22 June 2007

Visual Basic .NET Bordmittel ermöglichen es nicht, den Fenstertitel eines anderen Prozesses zu bestimmen. Jedoch ist dies mit der Win32 Api möglich, die Teil des Betriebssystems ist.

Dafür benötigt man zwei Funktionen:

Declare Auto Function FindWindow Lib "user32" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr

Declare Auto Function GetWindowText Lib "user32" (ByVal hwnd As IntPtr, ByVal lpString As Text.StringBuilder, ByVal nMaxCount As Integer) As Integer

FindWindow gibt das Handle eines Fensters zurück. Für uns ist der Parameter lpClassName entscheidend, dem man die Fensterklasse übergibt. (Z.B. Notepad)

GetWindowText schreibt den Titel eines Fensters in einen string-buffer.

Beispiel: Titel eines Notepad Fensters bestimmen.

Zuerst muss das Handle des Fensters bestimmt werden.

Dim hWnd As IntPtr 
hWnd = Win32Functions.FindWindow("Notepad", Nothing)

Nun kann man die Länge des Fenstertitels erfragen.

Dim titleLength As Integer
titleLength = Win32Functions.GetWindowTextLength(hWnd) + 1

Mit Fenster-Handle und Titel-Länge lässt sich nun der Titel abfragen.

Dim title As Text.StringBuilder

title = New Text.StringBuilder(titleLength)

Win32Functions.GetWindowText(hWnd, title, titleLength)

Console.WriteLine(title.ToString())

Der Titel des Fensters ist nun im StringBuilder title gespeichert.

image

Source Code

Module Module1
    Sub Main()
        Dim hWnd As IntPtr
        Dim title As String
        ' Handle des Fensters bestimmen
        hWnd = Win32Functions.FindWindow("Notepad", Nothing)
        Console.WriteLine("Handle: {0}", hWnd.ToString)
        If hWnd = IntPtr.Zero Then
            Console.WriteLine("No window found :(")
        Else
            ' Titel des Fensters bestimmen
            title = GetWindowTitle(hWnd)
            Console.WriteLine("Title: {0}", title)
        End If
        Console.ReadLine()
    End Sub

    Private Function GetWindowTitle(ByVal hWnd As IntPtr) As String
        Dim titleLength As Integer
        Dim title As Text.StringBuilder
        ' Länge des Titles bestimmmen (0 = 1, 1 = 2 usw. wichtig für die erstellung des string buffers)
        titleLength = Win32Functions.GetWindowTextLength(hWnd) + 1
        If titleLength = 1 Then Return String.Empty
        ' string buffer erstellen
        title = New Text.StringBuilder(titleLength)
        ' Titel in den buffer schreiben
        Win32Functions.GetWindowText(hWnd, title, titleLength)
        Return title.ToString
    End Function
End Module

' Notwendige Win32 Api Deklarationen (Siehe http://www.pinvoke.net)
Public Class Win32Functions
    Declare Auto Function FindWindow Lib "user32" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    Declare Auto Function GetWindowText Lib "user32" (ByVal hwnd As IntPtr, ByVal lpString As Text.StringBuilder, ByVal nMaxCount As Integer) As Integer
    Declare Auto Function GetWindowTextLength Lib "user32" (ByVal hwnd As IntPtr) As Integer
End Class


blog comments powered by Disqus