Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0756: Inhalt fremder Messageboxen auslesen

 von 

Beschreibung 

Ja - Es ist möglich, den Inhalt einer fremden MessageBox auszulesen!
Die üblichen Fenster-API's genügen.

Hier wird eine MessageBox über ihren Titel identifiziert und ihr Inhalt ausgelesen, aber letztendlich muss nur ihr hWnd bekannt sein.

Zu diesem Tipp existieren im Tippupload die folgende(n) Aktualisierung(en):
[VB 5/6 Tippvorschlag 0446] Verbesserug von Tipp 756: Inhalt fremder Messageboxen auslesen
[VB 5/6 Tippvorschlag 0447] Inhalt fremder MessageBoxen auslesen II

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

FindWindowA (FindWindow), FindWindowExA (FindWindowEx), GetWindowTextA (GetWindowText)

Download:

Download des Beispielprojektes [1,99 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 Projekt1.vbp -------------
' --------- Anfang Modul "Module1" alias Module1.bas ---------
Option Explicit

Declare Function FindWindow Lib "user32" _
                 Alias "FindWindowA" ( _
                 ByVal lpClassName As String, _
                 ByVal lpWindowName As String) As Long
                 
Declare Function FindWindowEx Lib "user32" _
                 Alias "FindWindowExA" ( _
                 ByVal hWnd1 As Long, _
                 ByVal hWnd2 As Long, _
                 ByVal lpsz1 As String, _
                 ByVal lpsz2 As String) As Long
                 
Declare Function GetWindowText Lib "user32" _
                 Alias "GetWindowTextA" ( _
                 ByVal hWnd As Long, _
                 ByVal lpString As String, _
                 ByVal cch As Long) As Long
                 
Const MaxLen As Long = 2048

Sub Main()

    Dim Success As Boolean
    Dim Title   As String
    
    Call MsgBox("Wir lesen den Inhalt einer MessageBox aus, die ""foo"" " & _
        "als Titel hat" & vbCrLf & "Erstellt diese ggf. vor dem " & _
        "Fortschreiten", vbInformation)
        
    Title = ReadMessageBoxContents("foo", Success)
    
    If Success Then
    
        Call MsgBox("Inhalt der fremden Messagebox: """ & Title & """", _
            vbInformation)
            
    Else
    
        Call MsgBox("Keine nichtleere Messagebox diesen Titels " & _
            "vorhanden!", vbExclamation)
            
    End If
    
End Sub

Public Function ReadMessageBoxContents(ByVal Title As String, Optional ByRef _
    Success As Boolean) As String
    
    Dim hWndMessage   As Long
    Dim hWndSub       As Long
    Dim Buffer        As String
    
    ' Messagebox suchen
    hWndMessage = FindWindow(vbNullString, Title)
    
    ' Hmm - keine da
    If hWndMessage = 0 Then
    
        Success = False
        
        Exit Function
        
    Else
    
        ' Erstes Fenster der Klasse STATIC suchen
        hWndSub = FindWindowEx(hWndMessage, 0&, "STATIC", vbNullString)
        
        ' Hmm - keines da
        If hWndSub = 0 Then
        
            Success = False
            
            Exit Function
            
        Else
        
            ' Text lesen
            Buffer = ReadWindowText(hWndSub, MaxLen)
            
        End If
        
        ' Wir haben versucht, das Icon zu lesen; das ist auch in Static
        If Buffer = "" Then
        
            ' Neuer Versuch
            hWndSub = FindWindowEx(hWndMessage, hWndSub, "STATIC", _
                vbNullString)
                
            ' Hmm - immernoch keines da
            If hWndSub = 0 Then
            
                Success = False
                
                Exit Function
                
            Else
            
                ' Text lesen - jetzt aber!
                Buffer = ReadWindowText(hWndSub, MaxLen)
                
            End If
        End If
    End If
    
    Success = True ' Jetzt ging's
    ReadMessageBoxContents = Buffer
    
End Function

Public Function ReadWindowText(ByVal hWnd As Long, Optional ByVal MaxLength _
    As Long = 1024) As String
    
    Dim Buffer As String
    
    Buffer = String$(MaxLen, Chr$(0))
    
    Call GetWindowText(hWnd, Buffer, MaxLength)
    
    Buffer = Left$(Buffer, InStr(Buffer, Chr$(0)) - 1)
    ReadWindowText = Buffer
    
End Function

' ---------- Ende Modul "Module1" alias Module1.bas ----------
' -------------- Ende Projektdatei Projekt1.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.