1

Тема: VBScript: проблемы с кодировкой при SendKeys

доброго времени суток уважаемым знатокам!

задача следующего рода :
1. открыть файл для чтения.
2. считать произвольную строку.
3. отредактировать строку.
4 передать как нажатие клавиш (sendKeys)

проблема :
1. при передаче переменной, вместо текста получаются крякозяблы.

попытка решения:

Set WshShell = CreateObject("WScript.Shell")
Set FSO = CreateObject("Scripting.FileSystemObject")
Set file = FSO.OpenTextFile("names.txt", 1,false,0)

Dim tmp,name,surname

'...

tmp = ""
name = ""
surname = ""
Randomize
for i = 0 to int(9999*rnd)+3 
    file.SkipLine()
next
tmp = file.ReadLine()
name = mid(tmp,1,instr(tmp,"_")-1)
surname = mid(tmp,instr(tmp,"_")+1,20)
tmp = ""

msgbox(name & "_!_" & surname) 'в сообщении явно показано, что строка считалась, и разделилась как мне нужно.

WScript.Sleep (2000)
WSHShell.SendKeys(name) 'в лучших фантазиях получаем просто "00" или "/". в худших - бред :(
'...

p.s. всяческие извращения с преобразованием кодировки исходного текстового файла, а также переменной не принесли успеха.

2

Re: VBScript: проблемы с кодировкой при SendKeys

Так в какой кодировке исходный файл вы знаете?

3

Re: VBScript: проблемы с кодировкой при SendKeys

сейчас исходный файл в 1251.
нет привязки к конкретной кодировке : в какой нужно -- в такой и будет.
я в прямом смысле слова перебрал все комбинации открытия файла(имеется ввиду 4-й параметр) и русские кодировки.

есть некий прогресс:
скрипт запущен на другом компьютере(ОС win7 на обеих), и нормально работает с русскими символами. НО! когда приходится отправлять латинские -- мы терпим поражение...
я связываю это с тем, что на другом компе по умолчанию стоит русская раскладка.
у меня же -- английская.

4

Re: VBScript: проблемы с кодировкой при SendKeys

rg81, проблема старая, известная и, в общем случае, средствами VBScript не очень решаемая. Ваш вывод про раскладки — верен.

Рекомендую для данных целей перейти на использование AutoIt (если нужна прозрачная работа с Automation), либо на AHK.

5

Re: VBScript: проблемы с кодировкой при SendKeys

В смысле проблема в том, что SendKeys некорректно отправляет английские символы, если текущая раскладка клавиатуры русская и наоборот?

6

Re: VBScript: проблемы с кодировкой при SendKeys

Тут играют роль две раскладки: самого скрипта и целевого окна. Скрипт запускается с раскладкой по умолчанию, и, видимо, SendKeys использует её для преобразования букв в нажатия клавиш. Поскольку русских букв нет в английской раскладке, а английских в русской, отсюда и странный результат. Некоторую логику уловить можно — например, буквы типа Í, Ý, É, которых в английской раскладке тоже нет, преобразуются в нажатия клавиш I, Y, E. Что с русскими происходит, не совсем понятно.

Кроме того, посылаются именно нажатия клавиш, а не буквы, поэтому нажатие клавиши А/Ф отобразится в целевом окне либо как английская буква А, либо как русская Ф, в зависимости от того, на какой язык ввода переключено окно.

По идее, первую проблему можно обойти, заменяя русские буквы на английские, которые стоят с ними на одной клавише (или английские на русские по той же логике). Но тут надо как-то узнать, какие на какие заменять, т.е. в какой раскладке запустился скрипт. И ещё остаётся вторая проблема — язык ввода целевого окна. Его нужно будет переключать туда-сюда, чтобы он соответствовал языку посылаемого в данный момент текста.

7

Re: VBScript: проблемы с кодировкой при SendKeys

да, все именно так, камень оказался именно в раскладках. при этом, как правильно сказал YMP, важно знать в какой раскладке целевое окно. важно заметить, что винда может хранить одно окно в одной раскладке, а другое - во второй.
скрипт выполняется в раскладке по умолчанию.
проблема решилась привязкой смены раскладки заданной комбинацией клавиш (в моем случае русская сменялась ctrl+1, а английская ctrl+0). таким образом, в какой бы раскладке не находилось целевое окно, мы установим нужную нам раскладку.
хорошим толчком была статья td4_robot (ЖЖ), на которую я случайно наткнулся.
http://td4-robot.livejournal.com/11584.html

всем спасибо, тема может быть закрыта.