我有一个显示一些HTML的WebBrowser控件 我希望用户能够复制整个文档,但不做任何其他事情。
我已将IsWebBrowserContextMenuEnabled
和WebBrowserShortcutsEnabled
属性设置为false
,我想处理KeyUp
并在用户按下Ctrl + C时运行一些代码。< / p>
我该怎么办?
WebBrowser控件不支持键盘事件
我尝试将表单的KeyUp
事件与KeyPreview
一起使用,但它根本没有触发。
编辑:这是我的解决方案,受到Jerb答案的启发。
class CopyableWebBrowser : WebBrowser {
public override bool PreProcessMessage(ref Message msg) {
if (msg.Msg == 0x101 //WM_KEYUP
&& msg.WParam.ToInt32() == (int)Keys.C && ModifierKeys == Keys.Control) {
DoCopy();
return true;
}
return base.PreProcessMessage(ref msg);
}
void DoCopy() {
Document.ExecCommand("SelectAll", false, null);
Document.ExecCommand("Copy", false, null);
Document.ExecCommand("Unselect", false, null);
}
}
答案 0 :(得分:10)
您也可以尝试这种方法。把它放在你的主表单区域,它应该捕获所有的键盘命令。我用它来为动态创建的标签添加键盘快捷键。
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
switch (keyData)
{
case Keys.Control|Keys.Tab:
NextTab();
return true;
case Keys.Control|Keys.Shift|Keys.Tab:
PreviousTab();
return true;
case Keys.Control|Keys.N:
CreateConnection(null);
return true;
}
return false;
答案 1 :(得分:4)
It is a bug in Windows Forms。它的IDocHostUIHandler.TranslateAccelerator实现实际上尝试通过在检查WebBrowserShortcutsEnabled并将密钥数据与预定义的快捷方式进行比较后返回S_OK来将键击发送到ActiveX主机。不幸的是,在Windows Forms的键盘处理中,在ProcessCmdKey期间检查了shortcutkey属性,这意味着IDocHostUIHandler.TranslateAccelerator返回的时间太晚了。这导致Shortcut枚举中的任何内容(例如,Control + C,Del,Control + N等)在WebBrowserShortcutsEnabled设置为false时停止工作。
您可以创建或查找提供不同IDocHostUIHandler.TranslateAccelerator实现的webbrowser ActiveX包装类(例如csexwb2),以再次检查快捷键。 Windows窗体webbrowser控件不允许自定义其IDocHostUIHandler实现。
答案 2 :(得分:0)
您可以设置键盘消息挂钩到您的webbrowser控件并过滤掉键盘消息或对它们进行一些处理。请查看以下代码是否适合您:
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, IntPtr windowTitle);
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("kernel32.dll")]
public static extern int GetCurrentThreadId();
public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);
public const int WH_KEYBOARD = 2;
public static int hHook = 0;
// keyboard messages handling procedure
public static int KeyboardHookProcedure(int nCode, IntPtr wParam, IntPtr lParam)
{
Keys keyPressed = (Keys)wParam.ToInt32();
Console.WriteLine(keyPressed);
if (keyPressed.Equals(Keys.Up) || keyPressed.Equals(Keys.Down))
{
Console.WriteLine(String.Format("{0} stop", keyPressed));
return -1;
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
// find explorer window
private IntPtr FindExplorerWindow()
{
IntPtr wnd = FindWindowEx(webBrowser1.Handle, IntPtr.Zero, "Shell Embedding", IntPtr.Zero);
if (wnd != IntPtr.Zero)
{
wnd = FindWindowEx(wnd, IntPtr.Zero, "Shell DocObject View", IntPtr.Zero);
if (wnd != IntPtr.Zero)
return FindWindowEx(wnd, IntPtr.Zero, "Internet Explorer_Server", IntPtr.Zero);
}
return IntPtr.Zero;
}
...
// install hook
IntPtr wnd = FindExplorerWindow();
if (wnd != IntPtr.Zero)
{
// you can either subclass explorer window or install a hook
// for hooking you don't really need a window handle but can use it
// later to filter out messages going to this exact window
hHook = SetWindowsHookEx(WH_KEYBOARD, new HookProc(KeyboardHookProcedure),
(IntPtr)0, GetCurrentThreadId());
//....
}
...
希望这有帮助,尊重
答案 3 :(得分:0)
经过大量调查,我们发现它是浏览器兼容性问题。
我们在HTML页面中添加了元标记,然后快捷方式正常运行。下面是示例代码。
<html>
<body>
<Head>
<meta http-equiv="X-UA-Compatible" content="IE=IE8" />
</head>
<form>
First name:<br>
<input type="text" name="firstname">
<br>
Last name:<br>
<input type="text" name="lastname">
</form></body>
</html>
这个问题有三种不同的解决方案。
添加元标记以使网站浏览器兼容。
覆盖&#34; PreocessCmdKey&#34;方法并处理快捷方式。
通过在FEATURE_BROWSER_EMULATION下添加密钥来模拟浏览器。
如果您不想在html代码中设置元标记,则可以在导航URL之前将元标记分配给webbrowser控件的Document文本属性。以下是样本。
//Setting compatible mode of IE.
this.m_oWebBrowser.DocumentText = @"<html>
<head><meta http-equiv=""X-UA-Compatible"" content=""IE=IE8"" /> </head>
<body></body>
</html>";
this.m_oWebBrowser.Navigate("www.google.com");