0

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

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

有没有人成功进入IWebBrowserEvets2WPF 的 COM 接口WebBrowser?我已经能够将WebBrowser.Document转换为IWebBrowser,但还没有到达我需要的地方。

请帮助我利用这些事件,以便我可以阻止用户创建新窗口和其他可能导致我的客户出现“安全”问题的事件。还是有更好的控制来渲染 HTML 和基本导航?

在此先感谢,
杰罗德

4

1 回答 1

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());
    }
}

祝你好运!

于 2012-04-05T21:25:22.690 回答