2017-06-27 47 views
0

私の研究中に得られたサンプルコードスニペットを使用して、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 

答えて

0

あなたが解決しようとしている実際の作業は何ですか?どのアプリケーションがWM_COPYDATAを送信しますか?

はそうでない場合は、単にいくつかの一般的なグーグルが明らかにした:

は、Windows Vista、ChangeWindowMessageFilterEx関数を呼び出す必要がありWM_COPYDATAメッセージを受信するアプリケーションを起動します。それ以外の場合、メッセージは受信されません。それはUIPIによってブロックされます。

たとえば、MFCアプリケーションで、あなたはフレームのOnCreateイベントハンドラに次のコードを追加できます:

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

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

関連する問題