Mithilfe von Beispielcode-Snippets, die während meiner Recherche abgerufen wurden, versuche ich die IMessageFilter-Schnittstelle in VS 2017 in einer VB.Net-Konsolenanwendung zu implementieren. Der folgende Code ist der relevante Teil eines größeren Projekts. Meine Testsuite enthält eine kompilierte AutoHotkey-App, die die WM_COPYDATA-Nachricht sendet, und die erstellte Version des VB-Codes soll diese Nachricht abfangen. Eine weitere AutoHotkey-Testanwendung wurde ebenfalls erstellt, um die gesendete Nachricht abzufangen, was erfolgreich funktioniert. Also, das Problem ist mit dem VB-Code.Implementieren von IMessageFilter in der VB.Net-Konsolenanwendung
Ich habe gewählt, die Windows-Nachricht nicht durch Überschreiben von WndProc abzufangen, da in der Konsolenanwendung kein Formular erstellt wird. Die Idee besteht einfach darin, die eingehende Nachricht abzufangen, die dann anderen Code veranlasst, die Umgebungsvariablen zu überprüfen, die von der sendenden AHK-App gesetzt wurden. Der VB-Code unterhalb erstellt erfolgreich und die EXE-Datei wird von einem Befehl in der AHK-App ausgeführt, die später die WM_COPYDATA-Nachricht sendet, wenn ein Hotkey gedrückt wird.
Der Code schreibt die empfangene Umgebungsvariable korrekt, aber schreibt nichts in Bezug auf die gesendete Windows-Nachricht.
Nachdem ich das IMessageInterface mit der myFilter-Klasse implementiert habe, glaube ich, dass die einzigen Schritte in Main() darin bestehen, diese Klasse zu instanziieren und das neue Objekt als Parameter mit Application.AddMessageFilter() zu übergeben. Da die Logger.txt-Datei nach dem Aufzeichnen der Umgebungsvariablen nicht aktualisiert wird, fehlt mir offensichtlich etwas. Jede Hilfe wird sehr geschätzt.
Sie können die kompilierte VB-App testen, indem Sie eine beliebige andere Anwendung verwenden, um eine Windows-Nachricht an sie zu senden.
Code:
' The Imports section contains statements which are relevant to other code
' not shown here
Imports System
Imports System.Security.Permissions
Imports System.Collections
Imports System.Runtime.InteropServices
Imports System.Windows.Forms
Imports System.IO
Imports System.Environment
Imports System.Diagnostics
Imports System.Threading
Imports System.Text
Imports System.Security
Module Module1
Public Const WM_COPYDATA As Integer = &H4A
Public logger As StreamWriter = New StreamWriter("logger.txt")
Sub Main()
Dim EnvString As String
EnvString = Environment.GetEnvironmentVariable("masterHandle")
logger.WriteLine("Master handle is {0}", EnvString)
Dim msgFilter As myFilter
msgFilter = New myFilter()
Application.AddMessageFilter(msgFilter)
Dim MSGFLT_ALLOW As Long = 1
ChangeWindowMessageFilterEx(Process.GetCurrentProcess().MainWindowHandle, WM_COPYDATA, MSGFLT_ALLOW, Nothing)
Console.ReadKey()
logger.Close()
End Sub
Public Class myFilter
Implements IMessageFilter
Public Function PreFilterMessage(ByRef m As System.Windows.Forms.Message) _
As Boolean Implements IMessageFilter.PreFilterMessage
logger.WriteLine("New message received")
If (m.Msg = WM_COPYDATA) Then
logger.WriteLine("CopyData message received")
End If
Return False
End Function
End Class
<DllImport("user32.dll")>
Public Function ChangeWindowMessageFilter(ByVal message As Long, ByVal dwFlag As Long) As Boolean
End Function
End Module