К сожалению. , после перехода на CefSharp.Wpf.Hwnd мы столкнулись с проблемой: InputLanguageManager перестал обнаруживать изменения раскладки клавиатуры, когда фокус находится внутри окна браузера (области, отображаемой Hwnd). Когда область браузера теряет фокус (например, когда мы щелкаем в другом месте приложения или в другом окне, например Excel или Блокноте), InputLanguageManager снова начинает работать правильно.
- Использование InputLanguageManager:
- Это отлично работает с CefSharp.Wpf, но перестал обнаруживать изменения макета с помощью CefSharp.Wpf.Hwnd, когда область браузера оказалась в фокусе.
- Мы попытались вручную получить текущую раскладку клавиатуры, используя собственный метод с собственными API-интерфейсами Windows (, GetWindowThreadProcessId и GetKeyboardLayout).
Код: Выделить всё
GetForegroundWindow
Код: Выделить всё
[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}"); }
- Использование собственных перехватчиков ():[/b]
Код: Выделить всё
SetWindowsHookEx
- Мы также пытались использовать глобальные перехватчики через 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, либо в другой элемент WPF, либо во внешнее приложение.
Как обнаружить изменения раскладки клавиатуры (например, переключение между английским и русским языками) в моем приложении WPF, когда фокус находится внутри CefSharp.Wpf .Hwnd-область визуализации? Есть ли способ восстановить функциональность InputLanguageManager, нашего специального метода GetKeyboardLayout или собственных перехватчиков при использовании CefSharp.Wpf.Hwnd?
Будем очень признательны за любые предложения или обходные пути!
Подробнее здесь: https://stackoverflow.com/questions/790 ... pplication