2

如何捕获某个窗口(在我的情况下为 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 消息随后发送,我正试图像这样找出它) .

4

5 回答 5

1

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

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

于 2010-05-27T10:07:51.277 回答
1

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

于 2010-05-29T17:55:18.517 回答
1

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

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

于 2010-05-27T09:35:54.577 回答
0

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

编辑:但是,因为 VLC 在单独的进程中运行,所以这种技术不起作用。NativeWindow.AssignHandle方法的文档指出:

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

于 2010-05-27T10:02:48.820 回答
0

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

于 2010-05-27T09:35:07.980 回答