Я сделал, чтобы WebBrowser управлял отображением некоторого HTML.
Я хочу, чтобы пользователь смог скопировать весь документ, но не сделать что-либо еще.
Я установил IsWebBrowserContextMenuEnabled
и WebBrowserShortcutsEnabled
свойства к false
, и я хочу обработать KeyUp
и выполненный некоторый код, когда пользователь нажимает Ctrl+C.
Как я могу сделать это?
Управление 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);
}
}
Можно попробовать и этот метод. Поместите его в основную область формы и он должен улавливать все команды клавиатуры. Я использую его для добавления горячих клавиш в динамически создаваемые табуляции.
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;
вы можете настроить перехват сообщений с клавиатуры на управление веб-браузером и отфильтровать сообщения клавиш клавиатуры или сделать некоторую обработку для них. Пожалуйста, посмотрите, подойдёт ли вам нижеприведённый код:
[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());
//....
}
...
надеемся, что это поможет, уважаемый
.Это ошибка в Windows Forms. Его реализация IDocHostUIHandler.TranslateAccelerator на самом деле пытается отправить нажатие клавиши на ActiveX хост, возвращая S_OK после проверки WebBrowserShortcutsEnabled и сравнения ключевых данных с предопределенными ярлыками. к сожалению, при обработке клавиатуры Windows Forms, свойство ярлыка проверяется во время ProcessCmdKey, что означает, что IDocHostUIHandler.TranslateAccelerator вернулся немного слишком поздно. Это приводит к тому, что что что-либо в перечислении Shortcut (например, Control+C, Del, Control+N и т.д.) перестаёт работать, когда WebBrowserShortcutsEnabled установлен в false.
Можно создать или найти класс ActiveX-обертки для веб-браузера (например, csexwb2), который предоставляет другую реализацию IDocHostUIHandler.TranslateAccelerator для повторной проверки клавиш быстрого доступа. Управление веб-браузером Windows Forms не позволяет настроить его реализацию IDocHostUIHandler.