首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在IMessageFilter控制台应用程序中实现VB.Net

在IMessageFilter控制台应用程序中实现VB.Net
EN

Stack Overflow用户
提问于 2017-06-27 19:08:32
回答 1查看 975关注 0票数 0

使用我在研究期间获得的示例代码片段,我试图在VS 2017中在VB.Net控制台应用程序中实现VB.Net接口。下面的代码是一个较大项目的相关部分。我的测试套件包括一个编译好的AutoHotkey应用程序,它发送WM_COPYDATA消息,而构建的VB代码版本就是为了捕捉这条消息。此外,还创建了一个测试AutoHotkey应用程序来捕获发送的消息,这是成功的。所以,问题在于VB代码。

由于控制台应用程序中没有创建窗体,所以我选择不通过重写WndProc来捕获windows消息。这个想法只是为了捕获传入的消息,这将导致其他代码检查由发送AHK应用程序设置的环境变量。下面的VB代码构建成功,exe文件从AHK应用程序中的一个命令运行,该命令稍后在热键按下时发送WM_COPYDATA消息。

代码正确地写入接收到的环境变量,但没有写入与发送的windows消息有关的任何内容。

在使用IMessageInterface类实现了myFilter之后,我认为Main()中要采取的唯一步骤是实例化该类,并将新对象作为参数传递给Application.AddMessageFilter()。由于Logger.txt文件在记录了环境变量后不会更新,所以我显然缺少了一些内容。任何帮助都将不胜感激。

您可以通过使用任何其他应用程序向其发送任何Windows消息来测试编译后的VB应用程序。

代码:

代码语言:javascript
复制
' 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
EN

回答 1

Stack Overflow用户

发布于 2017-07-14 11:01:49

你想要解决的实际任务是什么?哪个应用程序将发送WM_COPYDATA?

否则,只是一些普通的谷歌显示:

从Windows开始,接收WM_COPYDATA消息的应用程序必须调用ChangeWindowMessageFilterEx函数。否则,将不会收到该消息。它将被UIPI封锁。 例如,在MFC应用程序中,可以将此代码添加到框架的OnCreate处理程序中:

代码语言:javascript
复制
BOOL rc = ChangeWindowMessageFilterEx(m_hWnd, WM_COPYDATA, MSGFLT_ALLOW, NULL);

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44788039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档