Что нового

Обход проблемы с кодировкой при использовании Send

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Функция позволяет обойти проблему с кодировками при посылании текста используя функцию Send().
Один минус - используется буфер обмена.

Код:
;Автор: CreatoR
;Интерпритация на функцию Send(), только с использованием б.обмена - обход проблемы с кодировками

_SendEx("Текст на русском + On English")

Func _SendEx($sString)
	Local $sOld_Clip = ClipGet()
	
	ClipPut($sString)
	Sleep(10)
	Send("+{INSERT}")
	
	ClipPut($sOld_Clip)
EndFunc

Добавлено:
Сообщение автоматически объединено:

Ну и ещё одна функция на эту же тему...

Позволяет обойти проблему с нажатием г.клавиш при русской раскладке клавиатуры. Например при попытке копирования (^c) посылается буква «c» (англ.) а не сочетание клавиш.

Этот метод не использует переключение раскладки клавиатуры (спорный метод), тут просто конвертируются символы.

Код:
;Автор: CreatoR
;Обход проблемы с отправкой нажатии клавиш в русской раскладке клавиатуры

_SendExEx("^c")

Func _SendExEx($sKeys, $iFlag=0)
	If @KBLayout = 0419 Then
		Local $sANSI_Chars = "ёйцукенгшщзхъфывапролджэячсмитьбю.?"
		Local $sASCII_Chars = "`qwertyuiop[]asdfghjkl;'zxcvbnm,./&"
		
		Local $aSplit_Keys = StringSplit($sKeys, "")
		Local $sKey
		$sKeys = ""
		
		For $i = 1 To $aSplit_Keys[0]
			$sKey = StringMid($sANSI_Chars, StringInStr($sASCII_Chars, $aSplit_Keys[$i]), 1)
			
			If $sKey <> "" Then
				$sKeys &= $sKey
			Else
				$sKeys &= $aSplit_Keys[$i]
			EndIf
		Next
	EndIf
	
	Return Send($sKeys, $iFlag)
EndFunc
 

vovsla

Осваивающий
Сообщения
607
Репутация
36
функция обхода проблемы с кодировками будет работать не везде, например в окно cmd нельзя вставить по +{INSERT}, может можно что-то придумать по аналогии с http://autoit-script.ru/index.php?topic=367.0 , там конечно приём, но скорее всего можно что-то придумать и на посыл по коду и даже может конвертацию строки


Добавлено:
Сообщение автоматически объединено:

ой, чутка не туда ссылка была http://autoit-script.ru/index.php/topic,296.0.html
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Vovsla [?]
например в окно cmd нельзя вставить по +{INSERT}
А при чём здесь кодировка?
И в cmd-окно нельзя вставить текст через «Shift + Insert».
 

vovsla

Осваивающий
Сообщения
607
Репутация
36
я говорил про функцию
Код:
;Автор: CreatoR
;Интерпритация на функцию Send(), только с использованием б.обмена - обход проблемы с кодировками

_SendEx("Текст на русском + On English")

Func _SendEx($sString)
    Local $sOld_Clip = ClipGet()
   
    ClipPut($sString)
    Sleep(10)
    Send("+{INSERT}")
   
    ClipPut($sOld_Clip)
EndFunc

не везде получится такой обход, можно каким-либо другим способом обойти?
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Vovsla [?]
не везде получится такой обход
Конкретный пример можно? пример с cmd не релевантен, т.к в него вставить ничего нельзя в любом случае (имеется в виду клавиатурой и без дополнений).
 

vovsla

Осваивающий
Сообщения
607
Репутация
36
если это к cmd не относится, то вопрос снят.
 

r35p3ct

Продвинутый
Сообщения
228
Репутация
60
AutoIt 3.3.5.3 (бета)
« Создано: Февраль 06, 2010, 22:59:23 »
Значительно переписан код для Send/ControlSend, что позволяет приблизиться к совместимости с юникодными символами.
Требуется послать через ContolSend строку типа "Ляля/".
Если язык EN, то посылается но посылается "????/",если RU, то как и прежде "Ляля."
Как можно это реализовать? Может конечно это и косяк самой проги, куда шлю....

PS Версия 3.3.6.0
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Vovsla
если это к cmd не относится, то вопрос снят.

для cmd подойдёт вставка командой

Код:
$aPath = StringRegExp($sTarget, "(^.*)\\(.*)$", 3)
ClipPut($aPath[1])
Run(@SystemDir & '\cmd.exe /k cd "' & $aPath[0] & '"')
WinWait("[CLASS:ConsoleWindowClass]")
Send("!{SPACE}")
Send("{DOWN 6}")
Send("{ENTER}")
Send("{DOWN 2}")
Send("{ENTER}")
 

r35p3ct

Продвинутый
Сообщения
228
Репутация
60
Отвечаю сам же на свой вопрос.
Код:
$a='Ля/';Главное чтобы язык был Eng
ControlSend('','','',StringRegExpReplace($a,'\.','/'))
 

kzru_hunter

Осваивающий
Сообщения
144
Репутация
49
Думаю, проще использовать LoadKeyboardLayout, когда не отправляется Ctrl+V в русской раскладке клавиатуры. При этом функцию нужно вызвать после того, как окно, в котором нужно использовать Send, будет активировано.

Код:
_SetKeyboardLayout('00000409')

Func _SetKeyboardLayout($sLayoutID)
	Local $ret = DllCall("user32.dll", "long", "LoadKeyboardLayout", "str", $sLayoutID, "int", 1)
	return $ret[0]
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Тогда уж лучше так (окно может быть и неактивным):

Код:
_WinAPI_SetKeyboardLayout($hWnd, 0x0409)
 

HelpMe

Новичок
Сообщения
85
Репутация
3
А возможно написать скрипт который просто эмулировал нажатия/Символов/ скопировнанного текста?
я чайник :smile:
 

Crusaderman

Новичок
Сообщения
50
Репутация
0
добрый. у меня англиская винда, и есть ячайка в экселе в ней и инглишь и раша символы. пробывал уже много способов, но при переносе в другое ПО либо краказяблы либо "?????".
Да и аутоит не устоновле на пк, запускаю скрипт через AutoIt3.exe. 2 функции выше выдают такой же результат. при разных раскладка клавы. Причем Сенд в анг раскладке англ тект норм отправляет. мож библиотеки какие винды подключить надо?


Добавлено:
Сообщение автоматически объединено:

долго посидев с бубном сам решил свою проблему. пуская и примитивно зато работает ;D сильно не ругайте :whistle:
да и кстати если тайминга нет, то иногда все равно косяки вылазиют.

Код:
Func InvertLanguage($sString)
    Local $bEnglish[47] = [')', '!', '@', '#', '$', '%', '^', '&', '*', '(', 'A', "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", ":", "+", "<", "_", ">", "?", "~", "{", "|", "}", '"']
    Local $sEnglish[47] = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", ";", "=", ",", "-", ".", "/", "`", "[", "\", "]", "'"]
    Local $bRussian[47] = [')', '!', '"', '№', ';', '%', ' ', '?', '*', '(', 'Ф', "И", "С", "В", "У", "А", "П", "Р", "Ш", "О", "Л", "Д", "Ь", "Т", "Щ", "З", "Й", "К", "Ы", "Е", "Г", "М", "Ц", "Ч", "Н", "Я", "Ж", "+", "Б", "_", "Ю", ",", "Ё", "Х", "/", "Ъ", "Э"]
    Local $sRussian[47] = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'ф', "и", "с", "в", "у", "а", "п", "р", "ш", "о", "л", "д", "ь", "т", "щ", "з", "й", "к", "ы", "е", "г", "м", "ц", "ч", "н", "я", "ж", "=", "б", "-", "ю", ".", "ё", "х", "\", "ъ", "э"]
    Local $sResult, $sCompare
    For $i = 0 To StringLen($sString)
	$sSymbol = Asc(StringMid($sString, $i, 1))
	   For $y = 0 To 46
		   $hWin = WinGetHandle('[ACTIVE]')
            $iLayout = _WinAPI_GetKeyboardLayout($hWin)
			   If Asc($bEnglish[$y]) = $sSymbol Then
			   if $iLayout = "0x04090409" Then
				  sleep(100)
				  Send($bEnglish[$y])
				  ExitLoop
			   Else
				 _WinAPI_SetKeyboardLayout ($hWin , 0x0409)
				  sleep(100)
				  WinActivate($hWin)
				  Send($bEnglish[$y])
				  ExitLoop
				  EndIf
			   EndIf
			   If Asc($sEnglish[$y]) = $sSymbol Then
			   if $iLayout = "0x04090409" Then
				  sleep(100)
				  Send($sEnglish[$y])
				  ExitLoop
			   Else
				  _WinAPI_SetKeyboardLayout ($hWin , 0x0409)
				   sleep(100)
				   WinActivate($hWin)
				  Send($sEnglish[$y])
				  ExitLoop
				  EndIf
			   EndIf
			   If Asc($bRussian[$y]) = $sSymbol Then
			   if $iLayout = "0x04190419" Then
				  sleep(100)
				  Send($bRussian[$y])
			   Else
				  _WinAPI_SetKeyboardLayout ($hWin , 0x0419)
				   sleep(100)
				  WinActivate($hWin)
				  Send($bRussian[$y])
				  EndIf
			   EndIf
			   If Asc($sRussian[$y]) = $sSymbol Then
			   if $iLayout = "0x04190419" Then
				  sleep(100)
				  Send($sRussian[$y])
			   Else
				  _WinAPI_SetKeyboardLayout ($hWin , 0x0419)
				   sleep(100)
				  WinActivate($hWin)
				  Send($sRussian[$y])
				  EndIf
			   EndIf
			Next
	      Next
EndFunc
 
Верх