我正在开发一个需要显示由第三方服务返回的HTML的项目。我目前正在使用WPF WebBrowser
来显示此输出。然而,这在我的客户眼中造成了潜在的安全问题。当焦点设置为此控件时,您可以使用 CTRL + O 打开任何网页,或使用 Ctrl + N打开Internet Explorer 。我的应用程序针对类似于信息亭的环境(终端服务)。
过去我曾使用WinForms WebBrowser控件并能够通过COM沉入事件,但这些策略似乎不适用于WPF版本。我的开发合作伙伴坚持认为我们开发的是纯WPF应用程序,而不是混合在WinForms选项中。
有没有人成功进入WPF IWebBrowserEvets2
的{{1}} COM界面?我已经将WebBrowser
投放到了WebBrowser.Document
,但没有到达我需要的位置。
请帮助我点击事件,以便我可以阻止用户创建可能导致安全性的新窗口和其他事件。我的客户遇到的问题。或者是否有更好的控制来进行HTML和基本导航的渲染?
提前致谢,
杰罗德
答案 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());
}
}
祝你好运!