Что нового

Определение языка раскладки клавиатуры в нужном окне

S1R1US

скрипт мне запили!
Сообщения
50
Репутация
6
Добрый день.
Пишу "текстового бота", задумался над определением раскладки клавиатуры для определенного окна до импорта текста. Придумал вот такой велосипед:

Код:
#include <GUIConstants.au3>
#include <WinAPI.au3>

$Title1 = "Раскладка клавиатуры:"
$ru = "Русская"
$en = "English"
$Window1 = "HISTORY.txt — Блокнот"
$ruRU = 0000049
$enEN = 0000409


If WinActive ($Window1) = 1 Then
	If @KBLayout = $ruRU Then
		MsgBox (0, $Title1, $ru)
	ElseIf @KBLayout = $enEN Then
		MsgBox (0, $Title1, $en)
	EndIf

Else
	WinActivate ($Window1)
	If @KBLayout = $ruRU Then
		MsgBox (0, $Title1, $ru)
	ElseIf @KBLayout = $enEN Then
		MsgBox (0, $Title1, $en)
	EndIf
EndIf
Exit


Минус в том, что он неправильно определяет раскладку после "переключения" языков. Как будто у него в памяти "откладывается" эта раскладка. Знатоки, подскажите где ошибка, пожалуйста.
 
Автор
S

S1R1US

скрипт мне запили!
Сообщения
50
Репутация
6
InnI
Спасибо за совет, однако это мне не помогло. Раскладку пробовал извлечь так:

Код:
#include <GUIConstants.au3>
#include <WinAPIEx.au3>

$Title1 = "Раскладка клавиатуры:"
$Window1 = "HISTORY.txt — Блокнот"
$hWnd = WinGetHandle("[ACTIVE]")

WinActivate ($Window1)

	MsgBox (0, $Title1, _WinAPI_GetKeyboardLayout($hWnd))


В обоих случаях одна и та же ошибка после "переключения" между языками, раскладка возвращается в виде "запомнившегося" значения.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
S1R1US [?]
пробовал извлечь так
Вы сначала получаете дескриптор активного окна и только потом активируете нужное вам окно. Если вы запускаете из SciTE, то вы получите раскладку SciTE, а не блокнота.
 
Автор
S

S1R1US

скрипт мне запили!
Сообщения
50
Репутация
6
Благодаря Вам я докопался до сути проблемы, мой пример приобрел следующий вид:

Код:
#include <GUIConstants.au3>
#include <WinAPIEx.au3>

$Title1 = "Раскладка клавиатуры:"
$ru = "Русская"
$en = "English"
$Window1 = "HISTORY.txt — Блокнот"
$ruRU = 68748313
$enEN = 67699721

	If WinActive ($Window1) = 1 Then
	$hWnd = WinGetHandle("[ACTIVE]")
	If _WinAPI_GetKeyboardLayout($hWnd) = $ruRU Then
		MsgBox (0, $Title1, $ru)
	ElseIf _WinAPI_GetKeyboardLayout($hWnd) = $enEN Then
		MsgBox (0, $Title1, $en)
	EndIf

Else
	WinActivate ($Window1)
	$hWnd = WinGetHandle("[ACTIVE]")
	If _WinAPI_GetKeyboardLayout($hWnd) = $ruRU Then
		MsgBox (0, $Title1, $ru)
	ElseIf _WinAPI_GetKeyboardLayout($hWnd) = $enEN Then
		MsgBox (0, $Title1, $en)
	EndIf
EndIf
Exit


:IL_AutoIt_1:
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
S1R1US [?]
пример приобрел следующий вид
С вашего позволения... То же самое, но чуть проще
Код:
#include <GUIConstants.au3>
#include <WinAPIEx.au3>

$Title1 = "Раскладка клавиатуры:"
$ru = "Русская"
$en = "English"
$Window1 = "HISTORY.txt — Блокнот"
$ruRU = 68748313
$enEN = 67699721

If Not WinActive($Window1) Then WinActivate($Window1)
Switch _WinAPI_GetKeyboardLayout(WinGetHandle("[ACTIVE]"))
  Case $ruRU
    MsgBox (0, $Title1, $ru)
  Case $enEN
    MsgBox (0, $Title1, $en)
  Case Else
    MsgBox (0, $Title1, "Неизвестная")
EndSwitch
 
Верх