fixed bug - careet in notepad and menu start OS

This commit is contained in:
2026-08-08 23:00:37 +05:00
parent ba0748920b
commit 5ecc46f7a3
4 changed files with 113 additions and 33 deletions
+21 -1
View File
@@ -3,7 +3,7 @@ using System.Runtime.InteropServices;
namespace CursorLang.Interop;
/// <summary>
/// Win32 API для определения раскладки активного окна.
/// Win32 API для определения раскладки активного приложения.
/// </summary>
internal static class KeyboardLayoutNative
{
@@ -16,6 +16,26 @@ internal static class KeyboardLayoutNative
[DllImport("user32.dll")]
private static extern IntPtr GetKeyboardLayout(uint idThread);
/// <summary>
/// Раскладка, которой сейчас печатает пользователь.
/// </summary>
/// <remarks>
/// Спрашиваем окно с фокусом клавиатуры, а не окно верхнего плана: у Блокнота
/// Windows 11, меню «Пуск» и прочих приложений на WinUI поле ввода живёт в
/// отдельном потоке, и раскладка меняется только у него. У потока главного
/// окна она остаётся прежней, и переключение проходит незамеченным.
/// </remarks>
internal static int GetActiveLocaleId()
{
if (ForegroundInputNative.TryGetInfo(out ForegroundInputNative.GuiThreadInfo info) &&
info.hwndFocus != IntPtr.Zero)
{
return GetLocaleIdOf(info.hwndFocus);
}
return GetLocaleIdOf(GetForegroundWindow());
}
/// <summary>
/// Идентификатор локали для окна. Раскладка в Windows привязана к потоку,
/// поэтому так её видно у любого приложения, а не только у своего.