Закрепляем точку и запятую на клавишах независимо от текущей расскладки.
Возможно, в описании (приведеном в начале скрипта) разбираться муторно, но кто захочет вникнет без проблем...
/*
Закрепляем точку и запятую на кнопках независимо от текущей расскладки
на NumPad NumLock = запятая
на NumPad клавиша точки/Del = точка
клавиша русской точки = точка (как штатно в русской раскладке)
клавиша русской точки с нажатым Shift`ом = запятая (как штатно в русской раскладке)
клавиша русской точки с нажатым Ctrl`ом = "/" (как штатно в ангийской раскладке)
клавиша русской точки с нажатым Alt`ом = "?" (как штатно в ангийской раскладке)
клавиша русской точки с нажатым Ctrl+Shift`ом = "?" (как штатно в ангийской раскладке) ЗАКОММЕНТИРОВАНО
RWin = запятая
AppsKey = запятая
Ctrl+AppsKey = контекстное меню (штатное действие кнопки AppsKey)
Чтобы не терять функционал кнопки русской точки в ангийском языке символы "/" и "?" вводятся с нажатым Ctrl`ом или Ctrl+Shift`ом соответственно, однако если в системе комбинация клавиш Ctrl+Shift отвечает за смену языка, то потенциально возможны проблемы, хотя у меня работает корректно (если будут проблемы можно использовать Alt+русская точка для высыла вопросительного знака в скрипте закомментировано). Штатное действие NumLock выполняется от комбинаций Alt+NumLock или Shift+NumLock или Control+Shift+NumLock само, без указания комбинации в скрипте. До кучи оставил запятую на правом Win, однако ввиду отсутствия этой клавиши на многих ноутах удобнее использовать AppsKey - клавишу контекстного меню, что рядом с правым контролом (вызыв штатного действия кнопки контекстного меню при помощи Ctrl+AppsKey). Ввел максимум - лишнее прибиваем по усмотрению!
*/
SendMode, InputThenPlay
$vk6E:: ; клавиша точки/Del на NumPad = точка
EngAction = {vkBE} ; при ENG расскладке
RusAction = {vkBF} ; при RUS расскладке
GoTo, LookLanguage
$vkBF:: ; клавиша русской точки = точка
EngAction = {vkBE}
RusAction = {vkBF}
GoTo, LookLanguage
$vk5C:: ; RWin - правая кнопка Windows = Запытая
$vk90:: ; NumLock = Запытая
$vk5D:: ; AppsKey - клавиша контекстного меню = запятая
$+vkBF:: ; Shift+клавиша русской точки (русская запятая) = запятая
EngAction = {vkBC}
RusAction = {vk6E}
GoTo, LookLanguage
$^vk5D:: Send {vk5D} ; Ctrl+AppsKey = контекстное меню
$^vkBF:: Send {vk6F} ; Ctrl+русская точка = /
;$!vkBF:: Send {ASC 63} ; Alt+русская точка = ? (вопросительный знак)
$^+vkBF:: Send, {ASC 63} ; Ctrl+Shift+русская точка = ? (вопросительный знак)
LookLanguage:
Locale1=0x4090409 ; ENG
Locale2=0x4190419 ; RUS
WinGet, WinID,, A
ThreadID:=DllCall("GetWindowThreadProcessId", "Int", WinID, "Int", "0")
InputLocaleID:=DllCall("GetKeyboardLayout", "Int", ThreadID)
if(InputLocaleID=Locale1) ;если ENG
Send %EngAction%
else if(InputLocaleID=Locale2) ;если RUS
Send %RusAction%
Return
По поводу высыла значений кодов ASCII: берем значения символов из таблицы символов в WinXP она в Пуск->Программы->Стандартные->Служебные->Таблица символов, затем переводим hex=0x31->dec=49 сделать это можно даже стандартным калькулятором в инженерном виде. Если используете программу PSPad то выбрать в меню "Инструменты" -> "Таблица ASCII" (или Alt+A) - и сразу использовать содержимое столбца "DEC" (там же кстати есть еще и "hex" и "html").
Ту же точку клавишей NumDel можно выслать и вот так:
$vk6E:: Send, {ASC 46} ; NumPad, клавиша точки/Del (NumPadDel=точка)