Получение текущей раскладки в Windows 10

Разработка Far.
User avatar
John Doe
Бюрократ
Posts: 13931
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 76 times
Been thanked: 431 times
Contact:

Получение текущей раскладки в Windows 10

Post by John Doe »

Latest post of the previous page:

2useven10 wrote: Fri 23 Aug, 2019 22:09 вроде бы работает...
У меня при любой из 2х раскладок выдаёт 0x04090409.

Update
После перезапуска фара заработало.
Last edited by John Doe on Sun 25 Aug, 2019 12:59, edited 1 time in total.
User avatar
John Doe
Бюрократ
Posts: 13931
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 76 times
Been thanked: 431 times
Contact:

Получение текущей раскладки в Windows 10

Post by John Doe »

Удалось воспроизвести.
Не работает после обновления фара плагином UpdateEx, после того как обновлённый фар перезапускается в той же консоли.
User avatar
John Doe
Бюрократ
Posts: 13931
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 76 times
Been thanked: 431 times
Contact:

Получение текущей раскладки в Windows 10

Post by John Doe »

Вот тут описан намного более простой способ получения раскладки.

Code: Select all

local ffi = require("ffi")
ffi.cdef[[
HWND GetConsoleWindow(void);
HWND ImmGetDefaultIMEWnd(HWND unnamedParam1);
DWORD GetWindowThreadProcessId(HWND hWnd, LPDWORD lpdwProcessId);
DWORD GetKeyboardLayout(DWORD threadId);
]]
local C = ffi.C
local imm32 = ffi.load("Imm32.dll")
local hwnd = C.GetConsoleWindow()
local IMEWnd = imm32.ImmGetDefaultIMEWnd(hwnd)
local threadID = C.GetWindowThreadProcessId(IMEWnd, nil)
local inputLocaleID = C.GetKeyboardLayout(threadID)
far.Show(("%x"):format(inputLocaleID))
Такое в фар можно?

P.S.
История вопроса https://code.google.com/archive/p/waitzar/issues/118
https://t.me/FarManager — Telegram чат
User avatar
Zeroes
Мультикопипастер Броадкастер
Posts: 573
Joined: Wed 16 Mar, 2005 20:53
Location: Gomel \ Belarus
Has thanked: 1 time
Been thanked: 3 times
Contact:

Получение текущей раскладки в Windows 10

Post by Zeroes »

John Doe,
1) напомните плиз когда Far.KbdLayout() не работает?

2) выше код ваш у меня возвращает под Windows Terminal x409 всегда (мою деф. раскладку?) , под Conhost - работает.
а Far.KbdLayout() нормально отдаёт и для Conhost и WT. Win10.

3) в Autohotkey пока юзаю такой код:

Code: Select all

GetInputLangID(hWnd := '')
{
Try
  {
	(!hWnd) && hWnd := WinActive('A'), childPID := ''
	If WinGetProcessName(hWnd) = 'ApplicationFrameHost.exe'
	{
		pid := WinGetPID(hWnd)
		For ctl in WinGetControls(hWnd)
			DllCall('GetWindowThreadProcessId', 'Ptr', ctl, 'UIntP', childPID)
		Until childPID != pid
		DetectHiddenWindows True
		hWnd := WinExist('ahk_pid' childPID)
	}
	threadId := DllCall('GetWindowThreadProcessId', 'Ptr', hWnd, 'UInt', 0)
	lyt      := DllCall('GetKeyboardLayout', 'Ptr', threadId, 'UInt')
	Return langID := Format('{:#x}', lyt & 0x3FFF)
  }
}


F12::
{
CurLang := GetInputLangID()
MsgBox CurLang
}
Last edited by Zeroes on Mon 08 Jul, 2024 08:36, edited 2 times in total.
--- Zeroes & Ones ---
User avatar
John Doe
Бюрократ
Posts: 13931
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 76 times
Been thanked: 431 times
Contact:

Получение текущей раскладки в Windows 10

Post by John Doe »

Zeroes wrote: Mon 08 Jul, 2024 08:27 напомните плиз когда Far.KbdLayout() не работает?
Вообще не работал до 6286

Code: Select all

drkns 2024-03-14 18:58:33+00:00 - build 6286

1. Get keyboard layout from IMM.
Zeroes wrote: Mon 08 Jul, 2024 08:27 выше код ваш у меня возвращает под Windows Terminal x409 всегда (мою деф. раскладку?)
У меня тоже. Чтобы работало и под wt нужно ещё https://github.com/FarGroup/FarManager/ ... 36c7c2cc92
https://t.me/FarManager — Telegram чат
Post Reply

Return to “Development”