Автор Тема: Обход проблемы с кодировкой при использовании Send  (Прочитано 21241 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827
  • Репутация: 2287
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Функция позволяет обойти проблему с кодировками при посылании текста используя функцию Send().
Один минус - используется буфер обмена.

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

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

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


Добавлено: Октябрь 11, 2009, 07:05:58
Ну и ещё одна функция на эту же тему...

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

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

Код: AutoIt [Выделить]
;Автор: 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

« Последнее редактирование: Октябрь 11, 2009, 07:06:34 от CreatoR, Причина: Объединение сообщений »


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Русское сообщество AutoIt

Обход проблемы с кодировкой при использовании Send
« Отправлен: Октябрь 11, 2009, 06:38:59 »

Оффлайн Vovsla [?]

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


Добавлено: Январь 12, 2010, 15:44:42
ой, чутка не туда ссылка была http://autoit-script.ru/index.php/topic,296.0.html

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2287
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Vovsla  [?]
Цитировать
например в окно cmd нельзя вставить по +{INSERT}
А при чём здесь кодировка?
И в cmd-окно нельзя вставить текст через «Shift + Insert».

Оффлайн Vovsla [?]

  • Осваивающий
  • **
  • Сообщений: 522
  • Репутация: 26
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
я говорил про функцию
Код: AutoIt [Выделить]
;Автор: CreatoR
;Интерпритация на функцию Send(), только с использованием б.обмена - обход проблемы с кодировками

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

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

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

Русское сообщество AutoIt

Re: Обход проблемы с кодировкой при использовании Send
« Ответ #3 Отправлен: Январь 13, 2010, 10:42:17 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2287
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Vovsla  [?]
Цитировать
не везде получится такой обход
Конкретный пример можно? пример с cmd не релевантен, т.к в него вставить ничего нельзя в любом случае (имеется в виду клавиатурой и без дополнений).

Оффлайн Vovsla [?]

  • Осваивающий
  • **
  • Сообщений: 522
  • Репутация: 26
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
если это к cmd не относится, то вопрос снят.

Оффлайн r35p3ct [?]

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

PS Версия 3.3.6.0
« Последнее редактирование: Март 26, 2010, 00:03:37 от r35p3ct »

Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2723
  • Репутация: 1139
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
Vovsla
Цитировать
если это к cmd не относится, то вопрос снят.

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

Код: AutoIt [Выделить]
$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}")


Русское сообщество AutoIt

Re: Обход проблемы с кодировкой при использовании Send
« Ответ #7 Отправлен: Июнь 04, 2010, 01:40:44 »

Оффлайн r35p3ct [?]

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


Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2287
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
r35p3ct  [?]
Цитировать
Отвечаю сам же на свой вопрос.
А зачем там RegExp?

Оффлайн r35p3ct [?]

  • Продвинутый
  • ***
  • Сообщений: 226
  • Репутация: 60
  • Пол: Мужской
    • Награды
CreatoR  [?]
Цитировать
А зачем там RegExp?

Плохая привычка везде RegExp использовать :-X
Код: AutoIt [Выделить]
$a='Ля/';Главное чтобы язык был Eng
ControlSend('','','',StringReplace($a,'.','/'))
 


Оффлайн kzru_hunter [?]

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

Код: AutoIt [Выделить]
_SetKeyboardLayout('00000409')

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


Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Тогда уж лучше так (окно может быть и неактивным):

Код: AutoIt [Выделить]


Думай, прежде чем говорить.

Оффлайн HelpMe [?]

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

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2287
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
HelpMe  [?]
Цитировать
я чайник
Тебе сюда.

Русское сообщество AutoIt

Re: Обход проблемы с кодировкой при использовании Send
« Ответ #14 Отправлен: Ноябрь 28, 2010, 23:34:53 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
0 Ответов
2623 Просмотров
Последний ответ Декабрь 15, 2009, 03:03:15
от Sirioga
3 Ответов
3837 Просмотров
Последний ответ Май 26, 2011, 18:29:14
от CreatoR
19 Ответов
22847 Просмотров
Последний ответ Ноябрь 03, 2015, 02:23:08
от Skif_off
0 Ответов
1240 Просмотров
Последний ответ Август 13, 2013, 19:10:32
от madmasles
5 Ответов
3183 Просмотров
Последний ответ Октябрь 08, 2013, 15:41:07
от CreatoR
12 Ответов
4095 Просмотров
Последний ответ Октябрь 29, 2013, 10:38:30
от C2H5OH
7 Ответов
2491 Просмотров
Последний ответ Февраль 21, 2014, 17:49:09
от AZJIO
5 Ответов
1441 Просмотров
Последний ответ Март 26, 2015, 16:40:39
от noob
14 Ответов
2420 Просмотров
Последний ответ Май 21, 2015, 17:19:07
от madmasles
17 Ответов
1845 Просмотров
Последний ответ Март 19, 2017, 23:44:08
от Alofa