Что нового

[Окна, Диалоги] Неправильно отображаются символы. команда send

brine_124

Новичок
Сообщения
3
Репутация
0
Посмотрите пример кода
Код:
$sX=InputBox("Название","Введите имя компьютера")
$path = @DesktopDir & "\Компьютер " & $sX & " на свалку"
DirCreate($path)
Run("notepad.exe")
WinWaitActive("Безымянный — Блокнот")
Sleep(500)
Send("Проверка")
Send("^s")  ; посылаемая команда здесь зависить от раскладки. Как бы сделать универсальную команду на сохранение?
WinWaitActive("Сохранить как")
Send($path & "\тест.txt")
Send("{ENTER}")

Суть в том, что мы вводим имя компа, по этому имени создается папка на рабочем столе. В эту папку записывается текстовый документ с любым содержимым.

Проблема в следующем, если ввести имя компа на русском, то всё отлично работает. Если ввести имя на английском, т.е. оставить на время выполнения скрипта английскую раскладку, то все английские буквы отправляемые через SEND переводятся на русский, и в итоге при сохранении документа получается неправильный путь.

Прошу помочь как исправить эту проблему? Либо может есть способы сделать это как то проще???
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Модератор.
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Можно еще так
Код:
Run("notepad.exe")
WinWaitActive("[Class:Notepad]")
$handle1 = WinGetHandle("[Class:Notepad]")
ControlSend($handle1, "", "Edit1", "Тестовая строка")
WinMenuSelectItem($handle1, "", "&Файл", "Сохранить &как..." )

WinWaitActive("Сохранить как")
$handle2 = WinGetHandle("Сохранить как")
ControlSend($handle2, "", "[CLASS:Edit; INSTANCE:1]", @DesktopDir&"\Тест.txt")
ControlSend($handle2, "", "[CLASS:Edit; INSTANCE:1]", "{ENTER}")
WinClose($handle1, "")

Но имхо так
Код:
$file = FileOpen("test1.txt", 1)
FileWriteLine($file, "Тестовая строка")
FileClose($file)

проще и быстрее
 
Автор
B

brine_124

Новичок
Сообщения
3
Репутация
0
Спасибо за помощь! Но мне всё-таки требуется немножко другое. Мне надо обязательно использовать inputbox, и сохранить текстовый файл именно в созданную папку. С использование inputboxa и возникает проблема. Вот попробуйте запустить этот, немного исправленный код, и в inputbox ввести любые английские символы и нажать ок. Когда пойдет сохранение он путь впишет неправильно, напишет всё подряд русскими буквами...Если писать в inputbox на русской раскладке, то всё пройдет гладко
Код:
$sX=InputBox("Название","Введите имя компьютера")
$path = @DesktopDir & "\Компьютер " & $sX & " на свалку"
DirCreate($path)
Run("notepad.exe")
WinWaitActive("[Class:Notepad]")
$handle1 = WinGetHandle("[Class:Notepad]")
ControlSend($handle1, "", "Edit1", "Тестовая строка")
WinMenuSelectItem($handle1, "", "&Файл", "Сохранить &как..." )

WinWaitActive("Сохранить как")
$handle2 = WinGetHandle("Сохранить как")
ControlSend($handle2, "", "[CLASS:Edit; INSTANCE:1]", $path &"\Тест.txt")
ControlSend($handle2, "", "[CLASS:Edit; INSTANCE:1]", "{ENTER}")
WinClose($handle1, "")
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
А так?
Код:
$sX=InputBox("Название","Введите имя компьютера")
$path = @DesktopDir & "\Компьютер " & $sX & " на свалку"
DirCreate($path)
Run("notepad.exe")
WinWaitActive("[Class:Notepad]")
$handle1 = WinGetHandle("[Class:Notepad]")
ControlSetText($handle1, "", "Edit1", "Тестовая строка")
WinMenuSelectItem($handle1, "", "&Файл", "Сохранить &как..." )

WinWaitActive("Сохранить как")
$handle2 = WinGetHandle("Сохранить как")
ControlSetText($handle2, "", "[CLASS:Edit; INSTANCE:1]", $path &"\Тест.txt")
ControlSend($handle2, "", "[CLASS:Edit; INSTANCE:1]", "{ENTER}")
WinClose($handle1, "")


надо обязательно использовать inputbox, и сохранить текстовый файл именно в созданную папку.
Может все же лучше так?
Код:
$sX=InputBox("Название","Введите имя компьютера")
$path = @DesktopDir & "\Компьютер " & $sX & " на свалку"
DirCreate($path)
$file = FileOpen($path&"\test1.txt", 1)
FileWriteLine($file, "Тестовая строка")
FileClose($file)
 
Автор
B

brine_124

Новичок
Сообщения
3
Репутация
0
Yuriy, спасибо большое! оба способа работают, сейчас буду разбираться
 

Norm

Продвинутый
Сообщения
278
Репутация
74
Не стал создавать новую тему, поскольку проблема очень похожая.
Хотелось сделать более надежное обращение к окну проводника при сохранении документа,
поэтому решил попробовать использовать вместо Send функцию ControlSend
Если использовать Send, то строка вписывается нормально: C:\Users\Public\Documents\ZUSA.csv
Но с ControlSend происходит "оттторжение" первых букв и символов. Вписывается ? c.ßus€\public\Documents\ZUSA.csv
После чего, естественно ошибка
Код:
ControlSend("Speichern","","",@DocumentsCommonDir & "\ZUSA.csv")

[CLASS:Button; INSTANCE:1] указывать специально не стал, поскольку не знаю, как он в других версиях Windows будет, но и с ним тоже ничего не меняется.
Думал, что может нужно конкретно указать, что это строка (через команду String(ххх) ), но и это тоже не помогло.
Пробовал флаги подставлять 0 и 1, но тоже безрезультатно.
Точнее с 1 не прописывается только двоеточие после С. Вместо него стоит "." C.\Users\Public\Documents\ZUSA.csv
Такое впечатление, что регистр клавиши меняется, поскольку на ней стоит именно [ : / . ]

Может кто то знает как это победить?
 
Последнее редактирование:

ZaRaki

Знающий
Сообщения
48
Репутация
19
Скорее всего это из-за символов получаемые после @DocumentsCommonDir, а поскольку эти символы находятся на месте "string", то могут иметь не предсказуемый эффект, например + это шифт, ! это альт, и прочее.
Видимо сочетание C:\ может восприниматься по разному после преобразования в "string" особенно учитывая, что раскладка клавиатуры перед запуском скрипта - имеет значение.
Чтобы раскладка клавиатуры перед запуском скрипта не имела значения, и чтобы не было таких танцов со спец символами возвращаемые после @DocumentsCommonDir
Просто сначала получи путь, а потом впихай это как текст.
Код:
$getpath = @DocumentsCommonDir
ControlSend("Speichern","","",string($getpath) & "\ZUSA.csv")
 
Верх