none
请教 WPF中如何替换窗口过程函数 RRS feed

  • 问题

  • 我想改变WPF中浏览器控件WebBrowser的外观,所以想在浏览器窗口中绘制自己的图形,所以我尝试重载WebBrowser,但是我发现这是一个密封的类,所以想请教一下如何替换WebBrowser的窗口过程函数,就像MFC中的

    WNDPROC wpOrigEditProc = (WNDPROC) SetWindowLong(HeaderWnd, 
    GWL_WNDPROC, (LONG)SysHeader32Proc);

    这样,谢谢

    2012年4月18日 4:19

答案

  • WPF中浏览器控件WebBrowser其实只是再次封装了Winform 的WebBrowser, 或者说是对WebBrowser组件的一个WPF封装版本。所以你完全可以用winform的WebBrowser,两者完全一样。

    <Window x:Class="WpfApplication4.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
      <Grid>
        <WindowsFormsHost 
            xmlns:l="clr-namespace:WpfApplication4">
          <l:MyWebBrowser x:Name="wb"/>
        </WindowsFormsHost>
      </Grid>
    </Window>
    

    C#:

      public class MyWebBrowser : System.Windows.Forms.WebBrowser
      {
        protected override void WndProc(ref System.Windows.Forms.Message m)
        {
          base.WndProc(ref m);
        }
      }


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月19日 3:41
    版主

全部回复

  • WPF中浏览器控件WebBrowser其实只是再次封装了Winform 的WebBrowser, 或者说是对WebBrowser组件的一个WPF封装版本。所以你完全可以用winform的WebBrowser,两者完全一样。

    <Window x:Class="WpfApplication4.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
      <Grid>
        <WindowsFormsHost 
            xmlns:l="clr-namespace:WpfApplication4">
          <l:MyWebBrowser x:Name="wb"/>
        </WindowsFormsHost>
      </Grid>
    </Window>
    

    C#:

      public class MyWebBrowser : System.Windows.Forms.WebBrowser
      {
        protected override void WndProc(ref System.Windows.Forms.Message m)
        {
          base.WndProc(ref m);
        }
      }


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月19日 3:41
    版主
  • 嗯,谢谢哈 我试试。
    2012年4月19日 4:26
  • 再麻烦一下。。。 我试着在

    protected override void WndProc(ref System.Windows.Forms.Message m)

    中改写WM_PAINT消息,我在spy++中看到WM_PAINT消息是0x000f,然后尝试拦截:

                if (m.Msg == 0x000f)
                    return;

    但是,浏览器控件还是将原来的图像画出来了,在System.Windows.Forms.WebBrowser类中也没有发现OnDraw,OnRender,OnPaint之类的函数,

    请问System.Windows.Forms.WebBrowser这个控件是如何画出来的呢?

    难道Form对Msg重新包装了一次么?

    2012年4月20日 7:57
  • 浏览器组件即IE核心并没有公开可以拦截WM_PAINT消息去阻断绘制,他的绘制工作并不是交由GDI做的。所以你的思路是无效的。

    你如果只是要在浏览器区域绘制自己的图像,建议你拦截 WindowsFormsHost 的WM_PAINT消息。或者根据一些开源的浏览器核心 比如WebKit去自定义浏览器绘制方式和DOM渲染方法。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月23日 3:02
    版主
  • 嗯 最后采用的是 用一个透明窗口遮盖在浏览器控件的上方,谢谢哈
    2012年4月23日 7:28