Сочетание клавиш не доходит до управления браузером CefSharp - PullRequest
0 голосов
/ 18 марта 2020

У меня есть 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;
    }
}
...