【问题标题】:Trapping messages in .NET在 .NET 中捕获消息
【发布时间】:2010-05-30 01:55:18
【问题描述】:

如何捕获某个窗口(在我的情况下为 VLC 播放器窗口)发送的 Windows 系统消息(如 WM_SETTEXT)?我试图继承 NativeWindow 类并像这样覆盖 WndProc:

class VLCFilter : NativeWindow
{
    System.IntPtr iHandle;
    const int WM_SETTEXT = 0x000C;

    public VLCFilter()
    {
        Process p = Process.GetProcessesByName("vlc")[0];
        iHandle = p.MainWindowHandle;
    }

    protected override void WndProc(ref Message aMessage)
    {
        base.WndProc(ref aMessage);

        if (aMessage.HWnd != iHandle)
        return false;

        if (aMessage.Msg == WM_SETTEXT)
        {
            MessageBox.Show("VLC window text changed!");
        }
    }
}

我已与 Microsoft Spy++ 确认 WM_SETTEXT 消息是由 VLC 播放器发送的,但我的代码似乎无法完成工作。我主要指的是: http://www.codeproject.com/kb/dotnet/devicevolumemonitor.aspx

我试图让这项工作有一段时间没有成功。我究竟做错了什么?我没有做什么?也许有更简单的方法来做到这一点?

我最初的目标是捕捉 VLC 播放器(可能在后台某处播放并且未嵌入我的应用程序)重复播放的时间(注意到当时发送了 WM_SETTEXT 消息,我正试图找出它像这样)。

【问题讨论】:

    标签: c# system messages vlc


    【解决方案1】:

    您的代码是否已被访问?我猜你是从NativeWindow 继承的,但没有让你的实际窗口继承自VLCFilter 类。这实际上将是一件非常困难的事情,因为您可能必须重写System.Windows.Forms.Form...(我猜那里有继承,但老实说不确定框架的内部结构。)

    也许您应该从Form 继承,然后让您的表单从您的新类而不是Form 继承?

    【讨论】:

      【解决方案2】:

      我想,您可以使用hook 技术。它专为此类情况而设计。

      此外,这些链接可能很有用,尽管它们很容易被谷歌搜索到。 http://www.codeproject.com/KB/cs/netwin32hooks.aspx http://www.codeproject.com/KB/system/WilsonSystemGlobalHooks.aspx

      【讨论】:

      【解决方案3】:

      您好,感谢您的回答。 ;) 遵循:http://www.codeproject.com/KB/system/WilsonSystemGlobalHooks.aspx 成功了,现在我已经关注到我想要的事件了。一切正常,只有一个小故障:当覆盖 WndProc 时,它会在表单创建后立即开始接收消息。有没有办法暂时禁用 WndProc 接收这些消息并仅在我想获取它们时启用?

      【讨论】:

        【解决方案4】:

        在调用基本实现之前做好你的工作,否则Message 中的值可能已经改变。

        【讨论】:

          【解决方案5】:

          在您的代码中,您应该调用NativeWindow.AssignHandle。如果你不是(或者如果你传递了错误的句柄),那么你被覆盖的WndProc 将不会被调用。

          编辑:但是,由于 VLC 在单独的进程中运行,因此该技术将不起作用。 NativeWindow.AssignHandle 方法的文档说明:

          注意: 要分配的句柄不能在不同的应用程序进程中。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-03-25
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多