在.NET中捕获消息

时间:2010-05-27 09:31:39

标签: c# system messages vlc

如何捕获某些窗口发送的Windows系统消息(如WM_SETTEXT)(在我的情况下是VLC播放器窗口)?我试图继承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 ++检查过VLC播放器发送了WM_SETTEXT消息,但我的代码似乎没有完成工作。我主要提到: http://www.codeproject.com/kb/dotnet/devicevolumemonitor.aspx

我试图将这项工作推迟一段时间但没有成功。我究竟做错了什么?我不做什么?也许有更容易的方法来做到这一点?

我最初的目标是捕捉VLC播放器(可能在后台播放并且未在我的应用程序中播放)重复播放(已注意到WM_SETTEXT消息已发送然后我正试图找出它)像这样)。

5 个答案:

答案 0 :(得分:1)

您的代码是否已达到?我猜你是从NativeWindow继承的,但是没有让你的实际窗口从你的VLCFilter类继承。这实际上是一件非常困难的事情,因为你可能不得不重写System.Windows.Forms.Form ...(我猜测那里有继承,但老实说不确定框架中的内部结构。)< / p>

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

答案 1 :(得分:1)

我想,您可以使用hook技术。它是为这种情况而设计的。

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

答案 2 :(得分:1)

您好,感谢您的回答。 ;) 接下来:http://www.codeproject.com/KB/system/WilsonSystemGlobalHooks.aspx做了诀窍,现在我迷上了我想要的事件。一切正常,只有一个小问题:当overriding WndProc时,它会在创建表单后立即开始收到消息。有没有办法暂时禁用WndProc接收这些消息并仅在我想要获取它们时启用?

答案 3 :(得分:0)

在调用基础实现之前执行您的操作,否则Message中的值可能已更改。

答案 4 :(得分:0)

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

编辑但是,由于VLC在单独的进程中运行,因此该技术无效。 NativeWindow.AssignHandle方法的文档声明:

  

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