编写WebBrowser COM事件时出现问题

时间:2012-04-05 14:33:25

标签: wpf c#-4.0

我正在开发一个需要显示由第三方服务返回的HTML的项目。我目前正在使用WPF WebBrowser来显示此输出。然而,这在我的客户眼中造成了潜在的安全问题。当焦点设置为此控件时,您可以使用 CTRL + O 打开任何网页,或使用 Ctrl + N打开Internet Explorer 。我的应用程序针对类似于信息亭的环境(终端服务)。

过去我曾使用WinForms WebBrowser控件并能够通过COM沉入事件,但这些策略似乎不适用于WPF版本。我的开发合作伙伴坚持认为我们开发的是纯WPF应用程序,而不是混合在WinForms选项中。

有没有人成功进入WPF IWebBrowserEvets2的{​​{1}} COM界面?我已经将WebBrowser投放到了WebBrowser.Document,但没有到达我需要的位置。

请帮助我点击事件,以便我可以阻止用户创建可能导致安全性的新窗口和其他事件。我的客户遇到的问题。或者是否有更好的控制来进行HTML和基本导航的渲染?

提前致谢,
杰罗德

1 个答案:

答案 0 :(得分:0)

您可以尝试在此处使用Windows挂钩。找到浏览器窗口并为其安装适当的键盘挂钩。这个外部应该对你有所帮助:

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, IntPtr windowTitle);
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
private static extern IntPtr SetWindowsHookEx(Int32 idHook, HookProc lpfn, IntPtr hInstance, Int32 threadId);

以下是如何使用它们的示例,但您必须根据需要实现KeyboardHookProcedure。

private IntPtr FindExplorerWindow()
{
    IntPtr wnd = Browser.Handle;
    if (wnd != IntPtr.Zero)
    {
        wnd = FindWindowEx(wnd, IntPtr.Zero, "Shell DocObject View", IntPtr.Zero);
        if (wnd != IntPtr.Zero)
        {
            wnd = FindWindowEx(wnd, IntPtr.Zero, "Internet Explorer_Server", IntPtr.Zero);
            return wnd;
        }
    }
    return IntPtr.Zero;
}

private void InstallHook()
{
    if (_hHook.ToInt32() > 0) return;

    IntPtr wnd = FindExplorerWindow();
    if (wnd != IntPtr.Zero)
    {
        if (_hookProc == null)
        {
            _hookProc = new HookProc(KeyboardHookProcedure);
        }
        _hHook = SetWindowsHookEx(WH_KEYBOARD, _hookProc, (IntPtr)0, GetCurrentThreadId());
    }
}
祝你好运!