| 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
hWinParent = FindWindow(vbNullString, "Nachrichtendienst ")
If (hWinParent <> 0) Then
hWinOk = GetWindow(hWinParent, GW_CHILD)
hWinText = GetWindow(hWinOk, GW_HWNDNEXT)
lngTextLen = SendMessage(hWinText, WM_GETTEXTLENGTH, 0&, 0&)
strText = Space$(lngTextLen)
Call SendMessage(hWinText, WM_GETTEXT, lngTextLen + 1, strText)
Call SendMessage(hWinOk, BM_CLICK, 0&, 0&)
End If
GetMessageText = strText
End FunctionListing 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). |