Выкладываю код скрипта, умеющего делать следующее:
- Переключать раскладку клавиатуры, а именно: по нажатию клавиши Caps Lock - в другую раскладку, правой клавиши Alt - в английскую раскладку, правой клавиши Win - в русскую раскладку.
- Выводить tooltip с указанием текущей раскладки, расположенный чуть правее и чуть выше текстового курсора (правда, в некоторых программах tooltip появляется не совсем там (или совсем не там), где этого ожидает пользователь )
- Подавать звуковой сигнал при переключении раскладки (вполне возможно, что многих пользователей он будет только раздражать, так что рано или поздно придется придумать способ его отключения без ручного редактирования скрипта )
- Показывать текущую раскладку с помощью иконок в системном трее
- Обрабатывать нажатия клавиши Alt примерно так (с большой натяжкой ), как это делает Punto Switcher (правда, пока эта фича работает только в нескольких программах, специально прописанных в скрипте; новые придется добавлять вручную прямо в код скрипта)
; 2009-10-11
; very simple Russian-English keyboard layout switcher by Lazytech
; (my script is largely based on other developers' code and ideas;
; special thanks to people at http://forum.script-coding.com/)
; скрипт выполняется бесплатной программой AutoHotkey, которую
; можно скачать с оф. сайта: http://www.autohotkey.com/
; для нормальной работы скрипта следует поместить в одну и ту же папку
; файл .ahk (собственно скрипт) и все файлы .ico (иконки для индикации
; раскладки в системном трее: "EN", "RU" и "??")
; Caps Lock -- переключение раскладки клавиатуры для активного окна
; правая Alt -- включение английской раскладки для активного окна
; правая Win -- включение русской раскладки для активного окна
; функции клавиши Caps Lock берут на себя сочетания клавиш
; Ctrl + Caps Lock и Shift + Caps Lock
; для того, чтобы можно было заходить в меню программы, чье окно в данный момент
; активно, с использованием только клавиатуры (по нажатию левой клавиши Alt,
; поскольку правая клавиша Alt уже задействована в данном скрипте для включения
; английской раскладки), придется прописать в коде скрипта заголовки
; соответствующих программ.
#SingleInstance
Loop
{
Sleep, 300
WinGet, NewHWND, ID, A
if (no_detect_window <> -1) and (LastHWND = NewHWND)
{
Continue
}
else
{
LastHWND = %NewHWND%
WinGet, NewPID, PID, A
if (LastPID = NewPID)
{
Continue
}
else
{
LastPID = %NewPID%
new_layout := check_en_ru()
if (new_layout = "RU")
{
sound_RU() ; если звук не нужен, можно закомментировать
}
else if (new_layout = "EN")
{
sound_EN() ; если звук не нужен, можно закомментировать
}
Sleep, 300
}
}
}
~LAlt::
WinGetTitle, AWinTitle, A
WinTitleLen := StrLen(AWinTitle)
; список заголовков окон можно пополнить вручную:
if (SubStr(AWinTitle, WinTitleLen - 9) = " - Блокнот") && (check_en_ru() = "EN")
{
switch_en_ru("RU")
}
; список заголовков окон можно пополнить вручную:
else if (SubStr(AWinTitle, 1, 11) = "Akelpad - [") || (SubStr(AWinTitle, 1, 10) = "Aditor - [") || (SubStr(AWinTitle, 1, 10) = "Lister - [") && (check_en_ru() = "RU")
{
switch_en_ru("EN")
}
Return
sound_RU()
{
SoundBeep, 200, 30 ; для полного выключения звука закомментируйте
}
sound_EN()
{
SoundBeep, 5000, 30 ; для полного выключения звука закомментируйте
}
kbd_msg(text)
{
no_detect_window := -1
ToolTip, %text%, A_CaretX + 10, A_CaretY - 20
SetTimer, KbdRemoveToolTip, -1000
return
KbdRemoveToolTip:
ToolTip
no_detect_window := 1
return
}
check_en_ru_by_window_id(WinID)
{
SetFormat, Integer, H
Locale_En := 0x4090409 ; Английский (американский).
Locale_Ru := 0x4190419 ; Русский.
ThreadID:=DllCall("GetWindowThreadProcessId", "Int", WinID, "Int", "0")
InputLocaleID:=DllCall("GetKeyboardLayout", "Int", ThreadID)
if (store_layout <> InputLocaleID)
{
if(InputLocaleID = Locale_En)
{
Menu tray, icon, en2.ico
}
else if(InputLocaleID = Locale_Ru)
{
Menu tray, icon, ru2.ico
}
else
{
Menu tray, icon, __2.ico
}
}
store_layout = InputLocaleID
if(InputLocaleID = Locale_En)
{
return "EN"
}
else if(InputLocaleID = Locale_Ru)
{
return "RU"
}
else
{
return "??"
}
}
check_en_ru()
{
SetFormat, Integer, H
WinGet, WinID,, A
return check_en_ru_by_window_id(WinID)
}
switch_en_ru(set_layout)
{
old_layout := check_en_ru()
if (old_layout = set_layout)
{
kbd_msg(set_layout)
EXIT
}
if (old_layout = "RU")
{
set_layout := "EN"
}
else
{
set_layout := "RU"
}
if (set_layout = "RU")
{
SendMessage, 0x50,, % Locale_RU,, A
sound_RU()
}
else if (set_layout = "EN")
{
SendMessage, 0x50,, % Locale_EN,, A
sound_EN()
}
new_layout := check_en_ru()
kbd_msg(new_layout)
}
; переключение активного окна в другую раскладку
+Capslock::Capslock
Capslock::
switch_en_ru("")
Sleep, 300
return
kbd_en()
{
; переключение активного окна в английскую раскладку
PostMessage, 0x50, 0, 0x4090409,, A
kbd_msg("EN")
}
kbd_ru()
{
; переключение активного окна в русскую раскладку
PostMessage, 0x50, 0, 0x4190419,, A
kbd_msg("RU")
}
; переключаем активное окно в английскую раскладку по нажатию клавиши:
RAlt:: switch_en_ru("EN")
; переключаем активное окно в русскую раскладку по нажатию клавиши:
RWin:: switch_en_ru("RU")
Также выкладываю Zip-архив (1,6 Кбайт) с 3 иконками ("en2.ico", "ru2.ico", "__2.ico"). Художественный вкус у меня так себе, так что можете переделать иконки под свои запросы. Для этого достаточно изменить расширение файла на bmp, отредактировать картинку в любом графическом редакторе (хоть в MS Paint ) и поменять расширение файла обратно на ico
Кстати, так и не понял, почему AHK иногда ругается на следующую строку:
SetTimer, RemoveToolTip, Off
Закомментировал, пока всё работает
P.S. Поправил скрипт - teadrinker, благодарю за подсказку!
На всякий случай показываю ниже, что именно было исправлено.
Было:
kbd_msg(text)
{
no_detect_window := -1
ToolTip, %text%, A_CaretX + 10, A_CaretY - 20
SetTimer, KbdRemoveToolTip, 1000
return
KbdRemoveToolTip:
; SetTimer, RemoveToolTip, Off
ToolTip
no_detect_window := 1
return
}
Стало:
kbd_msg(text)
{
no_detect_window := -1
ToolTip, %text%, A_CaretX + 10, A_CaretY - 20
SetTimer, KbdRemoveToolTip, -1000
return
KbdRemoveToolTip:
ToolTip
no_detect_window := 1
return
}
Post's attachmentsico.zip 1.62 kb, 617 downloads since 2009-10-11
You don't have the permssions to download the attachments of this post.