Тема: AHK: Конвертация текста
В связи с тем, что все найденные мною сценарии-альтернативы программе Punto Switcher работали некорректно (вероятно, из-за Win10), решил подумать над выходом из ситуации. Придумал следующее:
Выделить последнее слово слева от каретки или выделить текст
Вырезать в буфер обмена
Сменить раскладку языка
Отправить текст в виде виртуального кода
Получить конвертированный текст
Не знаю, насколько такой метод имеет право на существование, но у меня он работает корректно, ничего не роняя.
Проблема в том, что работает на данный момент только лишь конвертация текста с латиницы в кириллицу. Т.е. если вырезать слово "ntrcn", получаю слово "текст". Если же вырезать слово "еуче", то вместо "text" я получаю только пробелы.
Сценарий отсюда вроде бы отлично распознает виртуальный код из символа, набранного на русском языке:
Char = N
VK := CharToVk(Char)
If VK
MsgBox, %VK%
Else
MsgBox, Invalid character.
; ---------- Function -----------
CharToVk(Char)
{
VK := DllCall("VkKeyScan", "uchar", Asc(Char), "Short")
If (VK = -1)
Return
SetFormat, Integer, H
VK := SubStr(VK & 0xFF, 3)
StringUpper, VK, VK
SetFormat, Integer, D
Return "vk" VK
}
Если первый параметр заменить на
Char = %Clipboard%
, то из скопированного "текст" получаю виртуальный код первой буквы, т.е. {vk4E}.
Сценарий, написанный по моей просьбе на основе вышеизложенного работает с буфером и отправляет слово целиком, однако, как упоминал, не распознает кириллицу:
^v::
KeyWait Ctrl
for k, v in StrSplit(clipboard)
SendInput % CharToVk(v)
return
CharToVk(Char) {
VK := Format("{:x}", GetKeyVK(Char))
if InStr("!@#$`%^&*()_+<>?:""|{}~",Char)
return "{vkA0 Down}{VK" VK "}{vkA0 Up}"
if Char is upper
return "{vkA0 Down}{VK" VK "}{vkA0 Up}"
else
return "{vk" VK "}"
return
}
Сейчас я использую следующий код, который необходимо привести в норму, а именно, добавить распознавание слов, набранных в русской раскладке, а также, наверное, будет лучше, если связать его с альтернативным буфером обмена. Ну, и было бы просто отлично, если бы он срабатывал как с последним набранным словом, так и с выделенным текстом. Буду признателен помощи разработчиков.
SendMode Input
#LAlt::
Send ^+{Left}^{vk58} ; Выделить и вырезать последнее слово слева от каретки
if (old_layout = "RU")
{
SendMessage, 0x50,, % Locale_EN,, A
}
else
{
SendMessage, 0x50,, % Locale_RU,, A
}
gosub, Paste
return
Paste:
{
KeyWait Ctrl
for k, v in StrSplit(clipboard)
SendInput % CharToVk(v)
return
CharToVk(Char) {
if !Char
return "{vk32}"
VK := DllCall("VkKeyScan", "uchar", Asc(Char), "Short")
if (VK = -1)
return
SetFormat, Integer, H
VK := SubStr(VK & 0xFF, 3)
StringUpper, VK, VK
SetFormat, Integer, D
if InStr("!@#$`%^&*()_+<>?:""|{}~",Char)
return "{vkA0 Down}{vk" VK "}{vkA0 Up}"
if Char is upper
return "{vkA0 Down}{VK" VK "}{vkA0 Up}"
else
return "{vk" VK "}"
}
}