2017-06-27 6 views
0

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 

Antwort

0

was ist die eigentliche Aufgabe, die Sie versuchen zu lösen? Welche Anwendung sendet die WM_COPYDATA?

Ansonsten nur einige allgemeine Googeln ergab:

Beginnend mit Windows Vista, die Anwendung, die die WM_COPYDATA Nachricht erhalten soll, muss die ChangeWindowMessageFilterEx Funktion aufrufen. Andernfalls wird die Nachricht nicht empfangen. Es wird von UIPI blockiert.

Zum Beispiel in einer MFC-Anwendung, können Sie diesen Code auf den OnCreate-Handler Rahmen hinzufügen:

BOOL rc = ChangeWindowMessageFilterEx(m_hWnd, WM_COPYDATA, MSGFLT_ALLOW, NULL); 

Quelle: https://msdn.microsoft.com/en-us/library/windows/desktop/ms649011(v=vs.85).aspx

Verwandte Themen