使用我研究期间获得的示例代码片段,我试图在VB.Net控制台应用程序中实现VS 2017中的IMessageFilter接口。下面的代码是大型项目的相关部分。我的测试套件涉及一个编译的AutoHotkey应用程序,它发送WM_COPYDATA消息,VB代码的内置版本用于捕获此消息。还创建了一个进一步的测试AutoHotkey应用程序来捕获已发送的消息,这成功地工作。所以,问题在于VB代码。
我选择不通过覆盖WndProc来捕获Windows消息,因为在控制台应用程序中没有创建任何表单。这个想法只是捕获传入的消息,然后将导致其他代码检查由发送AHK应用程序设置的环境变量。下面的VB代码构建成功,exe文件从AHK应用程序中的命令运行,该命令随后在按下热键时发送WM_COPYDATA消息。
代码正确写入接收到的环境变量,但不写与发送的Windows消息有关的任何内容。
使用myFilter类实现了IMessageInterface后,我相信在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 :(得分:0)
您要解决的实际任务是什么?哪个应用程序将发送WM_COPYDATA?
否则,只是一些通用的谷歌搜索显示:
从Windows Vista开始,接收WM_COPYDATA消息的应用程序必须调用ChangeWindowMessageFilterEx函数。否则,将不会收到该消息。它将被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