by beruk » 07 Sep 2023, 02:30
Проблема решена.
Появилась блестящая идея - отключить переключение раскладки в системе и переключать ее средствами АНК (спасибо мне).
Очень Искусственный Интеллект вида GPT-3.5 написал мне для этого нерабочий код (спасибо ему).
Два дня я заставлял его исправлять свои ошибки, которые мы находили по очереди (спасибо нам).
В итоге, во код:
Code: Select all
;==ПЕРЕКЛЮЧЕНИЕ РАСКЛАДКИ КЛАВИАТУРЫ==============================
!LShift:: ; ALT+SHIFT. Комбинация !+:: не будет работать без третьей клавиши (например!+X::) , нужно именно !LShift::
; Получение текущей раскладки клавиатуры
currentLayout := GetKeyboardLayout()
; Определение новой раскладки клавиатуры
newLayout := (currentLayout = "RU") ? "EN" : "RU"
; Переключение на новую раскладку клавиатуры
ToggleLayout(newLayout)
return
; Функция для получения текущей раскладки клавиатуры
GetKeyboardLayout()
{
; Получение хэндла активного окна
activeWindow := WinActive("A")
; Получение раскладки клавиатуры для активного окна
GetKeyboardLayoutName(activeWindow, layoutName)
; Извлечение кода раскладки из имени
StringMid, layoutCode, layoutName, 5, 2
; Возврат кода раскладки
return layoutCode
}
; Функция для переключения раскладки клавиатуры
ToggleLayout(layoutCode)
{
; Получение хэндла активного окна
activeWindow := WinActive("A")
; Определение кода сообщения для переключения раскладки
WM_INPUTLANGCHANGEREQUEST := 0x50
; Определение параметров сообщения для переключения раскладки
INPUTLANGCHANGE_FORWARD := 0x2
INPUTLANGCHANGE_BACKWARD := 0x4
; Определение параметров переключения раскладки
layoutChangeParam := (layoutCode = "EN") ? INPUTLANGCHANGE_FORWARD : INPUTLANGCHANGE_BACKWARD
; Отправка системного сообщения для переключения раскладки клавиатуры
PostMessage, % WM_INPUTLANGCHANGEREQUEST, % layoutChangeParam, 0,, ahk_id %activeWindow%
return
}
; Функция для получения имени раскладки клавиатуры
GetKeyboardLayoutName(hwnd, ByRef layoutName)
{
layoutName := ""
; Определение кода сообщения для получения имени раскладки
WM_INPUTLANGNAME := 0x50A
; Создание буфера для имени раскладки
VarSetCapacity(buffer, 256 * 2, 0)
; Отправка системного сообщения для получения имени раскладки клавиатуры
SendMessage, % WM_INPUTLANGNAME, 0, &buffer,, ahk_id %hwnd%
; Копирование имени раскладки из буфера
DllCall("WideCharToMultiByte", "uint", 0, "uint", 0, "ptr", &buffer, "int", 256, "str", &layoutName, "int", 256, "ptr", 0, "ptr", 0)
; Возврат имени раскладки
return layoutName
}
;================================================================
Проблема решена.
Появилась блестящая идея - отключить переключение раскладки в системе и переключать ее средствами АНК (спасибо мне).
Очень Искусственный Интеллект вида GPT-3.5 написал мне для этого нерабочий код (спасибо ему).
Два дня я заставлял его исправлять свои ошибки, которые мы находили по очереди (спасибо нам).
В итоге, во код:
[code];==ПЕРЕКЛЮЧЕНИЕ РАСКЛАДКИ КЛАВИАТУРЫ==============================
!LShift:: ; ALT+SHIFT. Комбинация !+:: не будет работать без третьей клавиши (например!+X::) , нужно именно !LShift::
; Получение текущей раскладки клавиатуры
currentLayout := GetKeyboardLayout()
; Определение новой раскладки клавиатуры
newLayout := (currentLayout = "RU") ? "EN" : "RU"
; Переключение на новую раскладку клавиатуры
ToggleLayout(newLayout)
return
; Функция для получения текущей раскладки клавиатуры
GetKeyboardLayout()
{
; Получение хэндла активного окна
activeWindow := WinActive("A")
; Получение раскладки клавиатуры для активного окна
GetKeyboardLayoutName(activeWindow, layoutName)
; Извлечение кода раскладки из имени
StringMid, layoutCode, layoutName, 5, 2
; Возврат кода раскладки
return layoutCode
}
; Функция для переключения раскладки клавиатуры
ToggleLayout(layoutCode)
{
; Получение хэндла активного окна
activeWindow := WinActive("A")
; Определение кода сообщения для переключения раскладки
WM_INPUTLANGCHANGEREQUEST := 0x50
; Определение параметров сообщения для переключения раскладки
INPUTLANGCHANGE_FORWARD := 0x2
INPUTLANGCHANGE_BACKWARD := 0x4
; Определение параметров переключения раскладки
layoutChangeParam := (layoutCode = "EN") ? INPUTLANGCHANGE_FORWARD : INPUTLANGCHANGE_BACKWARD
; Отправка системного сообщения для переключения раскладки клавиатуры
PostMessage, % WM_INPUTLANGCHANGEREQUEST, % layoutChangeParam, 0,, ahk_id %activeWindow%
return
}
; Функция для получения имени раскладки клавиатуры
GetKeyboardLayoutName(hwnd, ByRef layoutName)
{
layoutName := ""
; Определение кода сообщения для получения имени раскладки
WM_INPUTLANGNAME := 0x50A
; Создание буфера для имени раскладки
VarSetCapacity(buffer, 256 * 2, 0)
; Отправка системного сообщения для получения имени раскладки клавиатуры
SendMessage, % WM_INPUTLANGNAME, 0, &buffer,, ahk_id %hwnd%
; Копирование имени раскладки из буфера
DllCall("WideCharToMultiByte", "uint", 0, "uint", 0, "ptr", &buffer, "int", 256, "str", &layoutName, "int", 256, "ptr", 0, "ptr", 0)
; Возврат имени раскладки
return layoutName
}
;================================================================[/code]