amel27,
Цитата:
выделяем с CTRL пока размер выделенного фрагмента не превысит исходный (из буфера), потом возвращаемся обратно но уже без CTRL
|
Вот если бы можно было быстрее это делать... при длинном выделении очень медленно получается.
Мне удалось в моей функции преодалеть проблемы когда выделялся весь текст если исходное выделение было посредине слова.. плюс я вспомнил, ведь есть ещё
Opt("SendKeyDelay", 0) и
Opt("SendKeyDownDelay", 0) - увеличивает скорость в несколько раз

(на коротком выделении почти мгновенно)...
Вот финальная версия (с использованием обычного массива, без Dictionary, мне если честно немного не привычно ориентироваться в нём):
Код:

#NoTrayIcon
Opt("SendKeyDelay", 0)
Opt("SendKeyDownDelay", 0)
HotKeySet("`", "ConvertProc")
HotKeySet("^q", "Quit")
While 1
Sleep(100)
WEnd
Func ConvertProc()
Local $OldClip = ClipGet()
ClipPut("")
Send("^{Insert}")
Local $SelectedText = ClipGet()
If $SelectedText = "" Then
HotKeySet("`")
Send("`")
HotKeySet("`", "ConvertProc")
Return
EndIf
Local $NewClip = ConvertText($SelectedText)
ClipPut($NewClip)
Send("+{Insert}")
RestoreSelection($NewClip)
ClipPut($OldClip)
EndFunc
;If $Mode = 0 Then Russian language used
;If $Mode = 1 Then English language used
;If $Mode = -1 Then String Inverted
Func ConvertText($Text, $Mode=-1)
Local $StringIsUpper = 0, $TextRet = ""
Local $SplitTextArr = StringSplit($Text, "")
Local $LettersArr = GetLettersArr()
For $i = 1 To $SplitTextArr[0]
Local $i_0 = 1, $i_1 = 0
$StringIsUpper = 0
If StringIsUpper($SplitTextArr[$i]) Then $StringIsUpper = 1
If $Mode = 0 Or ($Mode = -1 And StringIsASCII($Text)) Then Local $i_0 = 0, $i_1 = 1
For $j = 1 To $LettersArr[0][0]
If $SplitTextArr[$i] = $LettersArr[$j][$i_0] Then
$SplitTextArr[$i] = $LettersArr[$j][$i_1]
ExitLoop
EndIf
Next
If $StringIsUpper = 1 Then $SplitTextArr[$i] = StringUpper($SplitTextArr[$i])
$TextRet &= $SplitTextArr[$i]
Next
Return $TextRet
EndFunc
Func GetLettersArr()
Local $AnsiStr = "ёйцукенгшщзхъфывапролджэячсмитьбю.?"
Local $AsciiStr = "`qwertyuiop[]asdfghjkl;'zxcvbnm,./&"
Local $StrLenght = StringLen($AnsiStr)
Local $LettersArr[$StrLenght+1][2]
$LettersArr[0][0] = $StrLenght
For $i = 1 To $StrLenght
$LettersArr[$i][0] = StringMid($AsciiStr, $i, 1)
$LettersArr[$i][1] = StringMid($AnsiStr, $i, 1)
Next
Return $LettersArr
EndFunc
Func RestoreSelection($rText)
Local $LeftJumps = GetLeftJumps($rText)
Send("^+{LEFT " & $LeftJumps & "}")
Send("^{Insert}")
Local $NewSelText = ClipGet()
If StringLen($NewSelText) > StringLen($rText) Then Send("+{RIGHT " & StringLen($NewSelText) - StringLen($rText) & "}")
EndFunc
Func GetLeftJumps($Text)
StringRegExpReplace($Text, '\n', '')
Local $Extended = @extended
$Text = StringStripWS($Text, 3)
$Text = StringRegExpReplace($Text, '\s+|\t+', ' ')
$Text = StringRegExpReplace($Text, '~|`|!|#|%|\^|&|\*|\(|\)|-|\+|=|\{|\}|''|"|;|:|/|\\|<|>|\?|,|\[|\]|ч|Ч|ё|Ё', '|')
$Text = StringRegExpReplace($Text, '\|+', '|')
Local $WordsCountArr = StringRegExp($Text, "[\s\.:;,]*([а-яА-Яa-zA-Z0-9-_]+)[\s\.:;,]*", 3)
StringRegExpReplace($Text, '\|', '')
$Extended += @extended + UBound($WordsCountArr)
Return $Extended
EndFunc
Func Quit()
Exit
EndFunc
Цитата:
там же добавил линк на параметры реестра
|
Спасибо, полезный линк

- правда нужной инфы я там не нашёл, а я прочитал каждую строчку на той страничке
