私の研究中に得られたサンプルコードスニペットを使用して、VB.NetコンソールアプリケーションでVS2017にIMessageFilterインターフェイスを実装しようとしています。以下のコードは、より大きなプロジェクトの関連部分です。私のテストスイートには、WM_COPYDATAメッセージを送信するコンパイルされたAutoHotkeyアプリケーションが含まれています。ビルドされたVBコードは、このメッセージをトラップするためのものです。送信されたメッセージをトラップするために、さらにテストAutoHotkeyアプリケーションが作成され、正常に動作します。だから、問題はVBコードです。VB.NetコンソールアプリケーションでIMessageFilterを実装する
コンソールアプリケーションでフォームが作成されていないため、WndProcをオーバーライドしてWindowsメッセージをトラップしないことを選択しました。このアイデアは着信メッセージをキャッチするだけで、送信するAHKアプリケーションによって設定された環境変数を他のコードがチェックするようになります。以下のVBコードは正常に構築され、exeファイルはAHKアプリケーションのコマンドから実行され、後でホットキーを押すとWM_COPYDATAメッセージが送信されます。
コードは受信した環境変数を正しく書き込みますが、送信されたウィンドウメッセージには何も書き込まれません。
IMessageInterfaceをmyFilterクラスで実装したので、Main()で実行する唯一のステップは、そのクラスをインスタンス化し、Application.AddMessageFilter()でパラメータとして新しいオブジェクトを渡すことだと思います。 Logger.txtファイルは環境変数を記録した後に更新されないので、私は明らかに何かが不足しています。どんな助けでも大歓迎です。
他のアプリを使ってコンパイル済みVBアプリケーションをテストして、Windowsメッセージを送信することができます。
コード:
' 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