在VB.Net控制台应用程序

时间:2017-06-27 19:08:32

标签: vb.net

使用我研究期间获得的示例代码片段,我试图在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

1 个答案:

答案 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