У меня есть cefSharp: ChromiumWebBrowser, который загружает различные веб-страницы для нашего приложения WPF. Одна из этих веб-страниц обрабатывает такие сочетания клавиш, как (Alt + S и Alt + C). Если страница вызывается из внешнего браузера, эти ярлыки работают должным образом. Но когда ярлыки используются в элементе управления cefSharp: ChromiusWebBrowser, они не работают.
Я попытался выяснить, обрабатываются ли ярлыки с помощью UserControl, который содержит элемент управления браузера, с помощью
private bool _altKeyPressed = false;
protected override void OnPreviewKeyDown(KeyEventArgs e)
{
if (_altKeyPressed)
{
_altKeyPressed = false;
if (e.SystemKey == Key.S || e.SystemKey == Key.C)
{
e.Handled = false;
}
}
if (e.SystemKey == Key.LeftAlt || e.SystemKey == Key.RightAlt)
{
_altKeyPressed = true;
}
base.OnPreviewKeyDown(e);
}
Я пробовал это с e.Handled = true и e.Handled = false. Этот код вызывается, но изменение свойства Handled не принесло улучшения. Я также попробовал тот же подход, подключив EventKandler PreviewKeyDown следующим образом:
<cefSharp:ChromiumWebBrowser x:Name="_browser" PreviewKeyDown="_browser_OnPreviewKeyDown">
Я не показываю код для _browser_OnPreviewKeyDown, потому что он такой же, как в OnPreviewKeyDown. Также этот код вызывается и не изменяется в поведении, независимо от того, установлено ли для параметра Handled значение true или false.
Кто-нибудь знает, как я могу заставить элемент управления Chromium вести себя так же, как внешний браузер с точки зрения ярлыков?
Обновление
В браузере не было обработчика клавиатуры. Поэтому я сделал один.
Пожалуйста, посмотрите комментарии в OnKeyEvent, чтобы увидеть, где я застрял в данный момент. Спасибо
public class KeyboardHandler : IKeyboardHandler
{
private bool _cefAltKeyPressed;
public bool OnPreKeyEvent(IWebBrowser chromiumWebBrowser, IBrowser browser, KeyType type, int windowsKeyCode, int nativeKeyCode, CefEventFlags modifiers, bool isSystemKey, ref bool isKeyboardShortcut)
{
const int KEY_C = 67;
const int KEY_S = 83;
bool result = true;
if (_cefAltKeyPressed)
{
if (windowsKeyCode == KEY_C || windowsKeyCode == KEY_S)
{
isKeyboardShortcut = true;
result = false;
}
_cefAltKeyPressed = false;
}
if ((modifiers & CefEventFlags.AltDown) != 0 && type == KeyType.RawKeyDown)
{
_cefAltKeyPressed = true;
}
return result;
}
public bool OnKeyEvent(IWebBrowser chromiumWebBrowser, IBrowser browser, KeyType type, int windowsKeyCode, int nativeKeyCode, CefEventFlags modifiers, bool isSystemKey)
{
// With the code in OnPreKeyEvent, OnKeyEvent is only called, when Alt + S or Alt + C is pressed in the browser
// So what am I supposed to do with this Event now?
// I do not want to implement a search (Alt + S) or clear (Alt + C) functionality here, since that is part of the web site
// I just want the website to be able to receive the Alt + S and Alt + C keystrokes and allow it to handle it
return false;
}
}