Тема: AHK: Break и Shift+Break как в пунто свитчере
Пытаюсь создать скрипт выполняющий функции как в PuntoSwitcher'е конвертирующие раскладку по клавише Break и Shift+Break(конвертировать раскладку напечатанного ранее или выделенного текста соответственно).
Вот что у меня получилось:
#NoEnv
#SingleInstance,Force
SendMode,Input
SetBatchLines,-1
SetKeyDelay,10
EN=0x4090409 ;Английский
RU=0x4190419 ;Русский
+break::
break::
{
keywait,break
; Узнаем текущую раскладку в активном окне
WinGet,ID,id,A
ThreadID:=DllCall("GetWindowThreadProcessId",UInt,ID,UInt,0)
LO:=DllCall("GetKeyboardLayout",UInt,ThreadID,UInt)
if % lo=EN
Lang=EN
else if % lo=RU
Lang=RU
if a_thishotkey=break ; Если клавиша Break
{
clipboard:= ; Очистка буфера
Loop ; Выделение и копирование текста в буфер
{
send,{CTRL DOWN}
Send,{SHIFT DOWN}
Send,{left}
Send,{SHIFT UP}
Send,{vk43}
Send,{CTRL UP}
ClipWait,1
if ErrorLevel=0
break
}
}
else if a_thishotkey=+break ; Если клавиша Shift+Break
{
clipboard:= ; Очистка буфера
; Копирование предварительно выделенного текста в буфер
Send,{CTRL DOWN}
Send,{vk43}
Send,{CTRL UP}
sleep,300
}
clip=%clipboard% ; Перенос текста из буфера в переменную
if lang=RU ; Обработка текста если раскладка была русская (а текс печатался английский например: РУДДЩ (HELLO))
{
SendMessage,0x50,,%EN%,,ahk_id %ID% ; Переключение на английскую раскладку для продолжения набора текста уже на английском
StringReplace,clip,clip, а , f , All
StringReplace,clip,clip, б , `, , All
StringReplace,clip,clip, в , d , All
StringReplace,clip,clip, г , u , All
StringReplace,clip,clip, д , l , All
StringReplace,clip,clip, е , t , All
StringReplace,clip,clip, ё , `` , All
StringReplace,clip,clip, ж , `; , All
StringReplace,clip,clip, з , p , All
StringReplace,clip,clip, и , b , All
StringReplace,clip,clip, й , q , All
StringReplace,clip,clip, к , r , All
StringReplace,clip,clip, л , k , All
StringReplace,clip,clip, м , v , All
StringReplace,clip,clip, н , y , All
StringReplace,clip,clip, о , j , All
StringReplace,clip,clip, п , g , All
StringReplace,clip,clip, р , h , All
StringReplace,clip,clip, с , c , All
StringReplace,clip,clip, т , n , All
StringReplace,clip,clip, у , e , All
StringReplace,clip,clip, ф , a , All
StringReplace,clip,clip, х , [ , All
StringReplace,clip,clip, ц , w , All
StringReplace,clip,clip, ч , x , All
StringReplace,clip,clip, ш , i , All
StringReplace,clip,clip, щ , o , All
StringReplace,clip,clip, ъ , ] , All
StringReplace,clip,clip, ы , s , All
StringReplace,clip,clip, ь , m , All
StringReplace,clip,clip, э , ' , All
StringReplace,clip,clip, ю , . , All
StringReplace,clip,clip, я , z , All
StringReplace,clip,clip, А , F , All ; *Проблема* Верхний регистр необрабатывается
StringReplace,clip,clip, Б , < , All
StringReplace,clip,clip, В , D , All
StringReplace,clip,clip, Г , U , All
StringReplace,clip,clip, Д , L , All
StringReplace,clip,clip, Е , T , All
StringReplace,clip,clip, Ё , ~ , All
StringReplace,clip,clip, Ж , : , All
StringReplace,clip,clip, З , P , All
StringReplace,clip,clip, И , B , All
StringReplace,clip,clip, Й , Q , All
StringReplace,clip,clip, К , R , All
StringReplace,clip,clip, Л , K , All
StringReplace,clip,clip, М , V , All
StringReplace,clip,clip, Н , Y , All
StringReplace,clip,clip, О , J , All
StringReplace,clip,clip, П , G , All
StringReplace,clip,clip, Р , H , All
StringReplace,clip,clip, С , C , All
StringReplace,clip,clip, Т , N , All
StringReplace,clip,clip, У , E , All
StringReplace,clip,clip, Ф , A , All
StringReplace,clip,clip, Х , { , All
StringReplace,clip,clip, Ц , W , All
StringReplace,clip,clip, Ч , X , All
StringReplace,clip,clip, Ш , I , All
StringReplace,clip,clip, Щ , O , All
StringReplace,clip,clip, Ъ , } , All
StringReplace,clip,clip, Ы , S , All
StringReplace,clip,clip, Ь , M , All
StringReplace,clip,clip, Э , `" , All
StringReplace,clip,clip, Ю , > , All
StringReplace,clip,clip, Я , Z , All
StringReplace,clip,clip, . , / , All
StringReplace,clip,clip, `" , @ , All
StringReplace,clip,clip, № , # , All
StringReplace,clip,clip, `; , $ , All
StringReplace,clip,clip, : , ^ , All
StringReplace,clip,clip, ? , & , All
StringReplace,clip,clip, / , | , All
}
else if lang=EN ; Обработка текста если раскладка была английская (а текс печатался русский например: YF:FNBT (НАЖАТИЕ))
{ ; *Проблема* Слово обрабатывается только до двоеточия тоесть на выходе получается YF:АТИЕ
SendMessage,0x50,,%RU%,,ahk_id %ID%
StringReplace,clip,clip, q , й , All
StringReplace,clip,clip, w , ц , All
StringReplace,clip,clip, e , у , All
StringReplace,clip,clip, r , к , All
StringReplace,clip,clip, t , е , All
StringReplace,clip,clip, y , н , All
StringReplace,clip,clip, u , г , All
StringReplace,clip,clip, i , ш , All
StringReplace,clip,clip, o , щ , All
StringReplace,clip,clip, p , з , All
StringReplace,clip,clip, a , ф , All
StringReplace,clip,clip, s , ы , All
StringReplace,clip,clip, d , в , All
StringReplace,clip,clip, f , а , All
StringReplace,clip,clip, g , п , All
StringReplace,clip,clip, h , р , All
StringReplace,clip,clip, j , о , All
StringReplace,clip,clip, k , л , All
StringReplace,clip,clip, l , д , All
StringReplace,clip,clip, z , я , All
StringReplace,clip,clip, x , ч , All
StringReplace,clip,clip, c , с , All
StringReplace,clip,clip, v , м , All
StringReplace,clip,clip, b , и , All
StringReplace,clip,clip, n , т , All
StringReplace,clip,clip, m , ь , All
StringReplace,clip,clip, Q , Й , All ; Верхний регистр необрабатывается
StringReplace,clip,clip, W , Ц , All
StringReplace,clip,clip, E , У , All
StringReplace,clip,clip, R , К , All
StringReplace,clip,clip, T , Е , All
StringReplace,clip,clip, Y , Н , All
StringReplace,clip,clip, U , Г , All
StringReplace,clip,clip, I , Ш , All
StringReplace,clip,clip, O , Щ , All
StringReplace,clip,clip, P , З , All
StringReplace,clip,clip, A , Ф , All
StringReplace,clip,clip, S , Ы , All
StringReplace,clip,clip, D , В , All
StringReplace,clip,clip, F , А , All
StringReplace,clip,clip, G , П , All
StringReplace,clip,clip, H , Р , All
StringReplace,clip,clip, J , О , All
StringReplace,clip,clip, K , Л , All
StringReplace,clip,clip, L , Д , All
StringReplace,clip,clip, Z , Я , All
StringReplace,clip,clip, X , Ч , All
StringReplace,clip,clip, C , С , All
StringReplace,clip,clip, V , М , All
StringReplace,clip,clip, B , И , All
StringReplace,clip,clip, N , Т , All
StringReplace,clip,clip, M , Ь , All
StringReplace,clip,clip, / , . , All
StringReplace,clip,clip, `@ , `" , All
StringReplace,clip,clip, # , № , All
StringReplace,clip,clip, `$ , `; , All
StringReplace,clip,clip, ^ , : , All
StringReplace,clip,clip, & , ? , All
StringReplace,clip,clip, | , / , All
StringReplace,clip,clip, `` , ё , All
StringReplace,clip,clip, ~ , Ё , All
StringReplace,clip,clip, < , Б , All
StringReplace,clip,clip, > , Ю , All
StringReplace,clip,clip, : , Ж , All
StringReplace,clip,clip, `" , Э , All
StringReplace,clip,clip, { , Х , All
StringReplace,clip,clip, } , Ъ , All
StringReplace,clip,clip, `, , б , All
StringReplace,clip,clip, . , ю , All
StringReplace,clip,clip, ? , `, , All
StringReplace,clip,clip, `; , ж , All
StringReplace,clip,clip, ' , э , All
StringReplace,clip,clip, [ , х , All
StringReplace,clip,clip, ] , ъ , All
}
send,%clip% ; Выделенный текст заменяется обработанным
}
return
Проблемы:
1) Необрабатываются буквы в верхнем регистре, весь текст преобразуется в нижний.
2) При нажатии Break я использовал посылку Ctrl+Shift+Left чтобы выделить слово перед курсором. Но если слово содержит русские буквы: х, ъ, ж, э, б, ю; напечатанные в английской раскладке слово выделаяется только до них а не целиком.(отмечено в коментах)
Наверняка эти проблемы решаются с комощью скан кодов и DLLCALL, к сожалению я незнаю как.