FAQ 0108: Wie kann ich Nachrichten senden und empfangen?
von Helge Rex
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.