如何捕获某些窗口发送的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消息已发送然后我正试图找出它)像这样)。
答案 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方法的文档声明:
注意: 要分配的句柄不能在不同的应用程序进程中。