CefSharp.Wpf.Hwnd блокирует обнаружение изменения раскладки клавиатуры в приложении WPFC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 CefSharp.Wpf.Hwnd блокирует обнаружение изменения раскладки клавиатуры в приложении WPF

Сообщение Anonymous »

Я работаю над приложением WPF, которое интегрирует CefSharp для отображения веб-контента. Первоначально мы использовали CefSharp.Wpf, и все работало как положено, включая возможность обнаруживать изменения раскладки клавиатуры с помощью InputLanguageManager. Однако из-за проблем с производительностью CefSharp.Wpf мы решили перейти на CefSharp.Wpf.Hwnd, что значительно повысило производительность.
К сожалению. , после перехода на CefSharp.Wpf.Hwnd мы столкнулись с проблемой: InputLanguageManager перестал обнаруживать изменения раскладки клавиатуры, когда фокус находится внутри окна браузера (области, отображаемой Hwnd). Когда область браузера теряет фокус (например, когда мы щелкаем в другом месте приложения или в другом окне, например Excel или Блокноте), InputLanguageManager снова начинает работать правильно.
  • Использование InputLanguageManager:
    • Это отлично работает с CefSharp.Wpf, но перестал обнаруживать изменения макета с помощью CefSharp.Wpf.Hwnd, когда область браузера оказалась в фокусе.
    < li>Реализация пользовательского метода GetKeyboardLayout:
    • Мы попытались вручную получить текущую раскладку клавиатуры, используя собственный метод с собственными API-интерфейсами Windows (

      Код: Выделить всё

      GetForegroundWindow
      , GetWindowThreadProcessId и GetKeyboardLayout).
    Вот упрощенная версия нашего метода:

    Код: Выделить всё

    [DllImport("user32.dll")]
    static extern IntPtr GetForegroundWindow();
    
    [DllImport("user32.dll")]
    static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
    
    [DllImport("user32.dll")]
    static extern IntPtr GetKeyboardLayout(uint idThread);
    
    private void DetectKeyboardLayout()
    {
    IntPtr foregroundWindow = GetForegroundWindow();
    uint processId;
    uint threadId = GetWindowThreadProcessId(foregroundWindow, out processId);
    IntPtr layout = GetKeyboardLayout(threadId);
    
    Console.WriteLine($"Current keyboard layout: {layout}");
    }
    
  • Использование собственных перехватчиков (

    Код: Выделить всё

    SetWindowsHookEx
    ):[/b]
    • Мы также пытались использовать глобальные перехватчики через SetWindowsHookEx для перехвата событий клавиатуры и обнаружения изменений раскладки.
    Вот базовый шаблон, который мы использовали:

    Код: Выделить всё

    [DllImport("user32.dll", SetLastError = true)]
    private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
    
    [DllImport("user32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool UnhookWindowsHookEx(IntPtr hhk);
    
    [DllImport("user32.dll")]
    private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
    
    private const int WH_KEYBOARD_LL = 13;
    private LowLevelKeyboardProc _proc = HookCallback;
    private IntPtr _hookID = IntPtr.Zero;
    
    private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
    
    private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
    {
    if (nCode >= 0)
    {
    // Detect keyboard layout change here...
    }
    return CallNextHookEx(_hookID, nCode, wParam, lParam);
    }
    
    private void SetHook()
    {
    _hookID = SetWindowsHookEx(WH_KEYBOARD_LL, _proc, IntPtr.Zero, 0);
    }
    
Когда фокус находится внутри CefSharp.Wpf.Hwnd, ни InputLanguageManager ни наш собственный метод GetKeyboardLayout, ни встроенные перехватчики клавиатуры не обнаруживают изменений раскладки клавиатуры.
Все подходы работают правильно, когда фокус перемещается за пределы области CefSharp.Wpf.Hwnd, либо в другой элемент WPF, либо во внешнее приложение.
Как обнаружить изменения раскладки клавиатуры (например, переключение между английским и русским языками) в моем приложении WPF, когда фокус находится внутри CefSharp.Wpf .Hwnd-область визуализации? Есть ли способ восстановить функциональность InputLanguageManager, нашего специального метода GetKeyboardLayout или собственных перехватчиков при использовании CefSharp.Wpf.Hwnd?
Будем очень признательны за любые предложения или обходные пути!

Подробнее здесь: https://stackoverflow.com/questions/790 ... pplication
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • CefSharp.Wpf.Hwnd блокирует обнаружение изменения раскладки клавиатуры в приложении WPF
    Anonymous » » в форуме C#
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Получение кодов клавиш при нажатии независимо от раскладки клавиатуры
    Anonymous » » в форуме C#
    0 Ответы
    32 Просмотры
    Последнее сообщение Anonymous
  • Установка раскладки клавиатуры raspi 3 на hun
    Anonymous » » в форуме Linux
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Android Studio «Невозможно найти копию окон раскладки клавиатуры»
    Anonymous » » в форуме Android
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • CEFSharp Ofscreen и стандартный браузер WPF в одном приложении
    Гость » » в форуме C#
    0 Ответы
    34 Просмотры
    Последнее сообщение Гость

Вернуться в «C#»