Die Community zu .NET und Classic VB.
Menü

FAQ 0108: Wie kann ich Nachrichten senden und empfangen?

 von 

Frage 

Wie kann ich Nachrichten senden und empfangen?

Nachrichten senden  

Der Nachrichten per API übers Netzwerk senden [Tipp 0536] zeigt, wie man mit einer Funktion der Win32-API Nachrichten versenden kann. Dieser Tipp funktioniert jedoch nur unter NT-basierten Windows-Versionen, da Windows 9x/ME und alle 16-Bit-Windows-Versionen die entsprechende Funktion nicht kennen.

Nachrichten empfangen  

Um Nachrichten empfangen zu können, muß auf dem System, auf dem die Nachricht empfangen werden soll, der Nachrichtendienst laufen. Eingehende Nachrichten werden von diesem Dienst angezeigt und protokolliert.

In Firmen ist hierzu die jeweilige EDV-Abteilung zu konsultieren.

Nachrichten abfangen  

Manchmal ist es nicht erwünscht, die Nachricht vom Dienst anzeigen zu lassen. Einer unserer Besucher namens Bastii hat folgenden Quelltext gepostet, mit dem die eingehenden Nachrichten von einer eigenen Anwendung ausgelesen und verarbeitet werden können.

Private Declare Function FindWindow Lib "user32" _
                Alias "FindWindowA" ( _
                ByVal lpClassName As String, _
                ByVal lpWindowName As String) As Long

Private Declare Function GetWindow Lib "user32" ( _
                ByVal hWnd As Long, _
                ByVal wCmd As Long) As Long

Private Declare Function SendMessage Lib "user32" _
                Alias "SendMessageA" ( _
                ByVal hWnd As Long, _
                ByVal wMsg As Long, _
                ByVal wParam As Long, _
                ByRef lParam As Any) As Long

Private Const GW_CHILD As Long = &H5
Private Const GW_HWNDNEXT As Long = &H2
Private Const BM_CLICK As Long = &HF5
Private Const WM_GETTEXT As Long = &HD
Private Const WM_GETTEXTLENGTH As Long = &HE

Private Function GetMessageText() As String
    Dim hWinParent As Long
    Dim hWinText As Long
    Dim hWinOk As Long
    Dim strText As String
    Dim lngTextLen As Long
    
    strText = vbNullString
    
    '   Leerzeichen beachten
    hWinParent = FindWindow(vbNullString, "Nachrichtendienst ")
    
    '   Wurde ein Dialog des Nachrichtendienstes gefunden?
    If (hWinParent <> 0) Then
        '   Ja, Handle des OK-Buttons holen
        hWinOk = GetWindow(hWinParent, GW_CHILD)
        
        '   Handle der Nachricht holen
        hWinText = GetWindow(hWinOk, GW_HWNDNEXT)
        
        '   Länge der Nachricht auslesen und
        '   Buffer entsprechend vorbereiten
        lngTextLen = SendMessage(hWinText, WM_GETTEXTLENGTH, 0&, 0&)
        strText = Space$(lngTextLen)
        
        '   Nachricht auslesen
        Call SendMessage(hWinText, WM_GETTEXT, lngTextLen + 1, strText)
        
        '   Dialog des Nachrichtendienstes schließen
        Call SendMessage(hWinOk, BM_CLICK, 0&, 0&)
    End If
        
    '   Rückgabe setzen
    GetMessageText = strText
End Function

Listing 1: Nachrichten abfangen

Um diese Funktion zu verwenden, sollte man sie in periodischen Abständen (z. B. unter Verwendung eines Timer-Steuerelements) aufrufen. Bastii schlug hierfür ein Interval von 50 ms vor.

Eine noch nicht geprüfte Lösung besteht darin, denn Nachrichtendienst zu beenden und dann selbst den Mailslot 'messenger' auszulesen, über welchen nach Aussage von Frank Grimm die Nachrichten des Nachrichtendienstes eintrudeln:
Mailslots - virtuelle EMail-Postfächer (Workshop von vb@archiv).

Ihre Meinung  

Falls Sie Fragen zu dieser FAQ haben, Ihre Erfahrung mit anderen Nutzern austauschen möchten oder auf eine Ergänzung hinweisen 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.