是这样的,我想要实时监视程序的窗体创建,所以添加了一个消息筛选器。通过查MSDN知道窗体创建的消息号为0x0001。接口的实现 public bool PreFilterMessage(ref Message m)
{
if (m.Msg != 0x0001)
return false;
Form form = Control.FromChildHandle(m.HWnd) as Form;
return false;
}可问题来了,我发现好像0x0001是不对的。通过 public bool PreFilterMessage(ref Message m)
{
Form form = Control.FromChildHandle(m.HWnd) as Form;
if (form != null)
Console.WriteLine(m.Msg);
return false;
}调试后发现创建窗体的消息号不但不是0x0001,而且在每次系统重启后数字都是不同的。
{
if (m.Msg != 0x0001)
return false;
Form form = Control.FromChildHandle(m.HWnd) as Form;
return false;
}可问题来了,我发现好像0x0001是不对的。通过 public bool PreFilterMessage(ref Message m)
{
Form form = Control.FromChildHandle(m.HWnd) as Form;
if (form != null)
Console.WriteLine(m.Msg);
return false;
}调试后发现创建窗体的消息号不但不是0x0001,而且在每次系统重启后数字都是不同的。
PreFilterMessage方法不能拦截的,原因是窗体自身处理后就不在传递了用如下方法,在弹出的窗口中可以拦截创建消息
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_CREATE) else
base.WndProc(ref m);
}
public bool PreFilterMessage(ref Message m)
{
if (m.Msg == WM_CREATE)
{
return true;
}
else
return false;
} protected override void WndProc(ref Message m)
{
if (m.Msg == WM_CREATE)
// 调用该方法可以传递消息到程序的筛选器,并返回修改后的消息
Application.FilterMessage(ref m);
else
base.WndProc(ref m);
}
public bool PreFilterMessage(ref Message m)
{
if (m.Msg != 0xF)
return false;
Form form = Control.FromChildHandle(m.HWnd) as Form;
return false;
}
你仔细看看我四楼写的文字,PreFilterMessage只能拦截应用程序消息队列中的消息,
而WM_CREATE,WM_CLOSE消息不会被发送到消息队列中,而是直接发送到该窗口的回调函数WndProc()中直接处理了。明白了吗?
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0001)
{ }
base.WndProc(ref m);
}
可以接收到创建消息。
不过这样就只能自己写个基类窗体,然后让其他窗体继承才能实现我要的效果了,就没其他的办法吗? 还有你4楼那段是从哪本书看的啊,我怎么找不到这种资料。
究竟是那本书中的我也不知道了,去看一下windows sdk和MFC,会讲述这些知识的
public bool PreFilterMessage(ref Message m)
{
if (m.Msg == WM_CREATE)
{
return true;
}
else
return false;
} protected override void WndProc(ref Message m)
{
if (m.Msg == WM_CREATE)
// 调用该方法可以传递消息到程序的筛选器,并返回修改后的消息
Application.FilterMessage(ref m);
else
base.WndProc(ref m);
}