Что нового

Два почти одинаковых скрипта а результат разный - почему?

andrystepa

Новичок
Сообщения
9
Репутация
0
Я только учусь. Хотел создать скрипт, который просто открывает в notepad'е меню Файл->Параметры страницы
Вот код первого скрипта:
Код:
; Script Start - Add your code below here
Run("notepad.exe")
WinWaitActive("Безымянный - Блокнот")
Send("This is some text.")
WinMenuSelectItem("Безымянный - ", "", "&Файл", "Пара&метры страницы" )
Сохранил, запускаю - все прекрасно работает!!
Пишу второй скрипт. От первого отличается только тем, что вместо простого запуска notepad открывается существующий файл:
Код:
; Script Start - Add your code below here
ShellExecute("f:\Scripts\text.txt", "", "", "edit")
WinMenuSelectItem("text - ", "", "&Файл", "Пара&метры страницы" )
Сохраняю, запускаю - файл открывается, а меню нет! Думал надо вставить WinWaitActive("Безымянный - Блокнот") после ShellExecute, но все равно не помогает.
В чем проблема? Кто знает, подскажите!
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
Код:
ShellExecute("f:\Scripts\text.txt", "", "", "edit")
WinWaitActive("text.txt - ")
WinMenuSelectItem("text.txt - ", "", "&Файл", "Пара&метры страницы" )
 
Автор
A

andrystepa

Новичок
Сообщения
9
Репутация
0
Я так уже пробовал - я написал об этом в первом посте. Не помогает!
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
andrystepa
Вы скопируйте пример и попробуйте.
 
Автор
A

andrystepa

Новичок
Сообщения
9
Репутация
0
Скопировал, попробовал - не работает! Я же писал что уже так делал. И в дебаггере гонял. Застревает как раз на строке:
WinWaitActive("text.txt - ")
и дальше не идет.
 

VladUs

Скриптер
Сообщения
621
Репутация
181
Код:
ShellExecute("f:\Scripts\text.txt", "", "", "edit")
WinWaitActive("Text.txt - ")
WinMenuSelectItem("Text.txt - ", "", "&Файл", "Пара&метры страницы" )


Я бы для надежности сделал бы так

Код:
ShellExecute("f:\Scripts\text.txt", "", "", "edit")
$hwnd = WinWaitActive("[CLASS:Notepad]", "")
WinMenuSelectItem($hwnd, "", "&Файл", "Пара&метры страницы" )
 
Автор
A

andrystepa

Новичок
Сообщения
9
Репутация
0
А вот теперь заработало! Странно все-таки - почему же в первом скрипте, где просто запускался нотепад, хендл окна был не нужен, а тут понадобился?
И еще вот это выражение: "[CLASS:Notepad]" - я в справке искал, но не нашел. Где про него можно почитать? И если мне надо будет открывать файл с помощью Adobe Acrobat Pro, что надо писать вместо Notepad?
 

joiner

Модератор
Локальный модератор
Сообщения
3 385
Репутация
592
у меня сработало так
Код:
ShellExecute("text.txt")
WinWaitActive("text")
WinMenuSelectItem("text", "", "&Файл", "Пара&метры страницы" )

в справке по
Код:
WinMenuSelectItem
есть ссылка на "Заголовки и текст окон (дополнительно)"
 
Автор
A

andrystepa

Новичок
Сообщения
9
Репутация
0
И у меня такой тоже заработал. А вот такой:
Код:
ShellExecute("f:\Scripts\Form_A3_h.pdf")
WinWaitActive("Form_A3_h", "")
WinMenuSelectItem("Form_A3_h", "", "&Редактирование", "Установ&ки...")
почему-то не работает! Что за избирательность такая? На всякий случай - .pdf файлы у меня по умолчанию открывает Adobe Acrobat Pro.
А вот это: есть ссылка на "Заголовки и текст окон (дополнительно)" - про что Вы сказали? И где эту ссылку искать?
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
andrystepa [?]
А вот это: есть ссылка на "Заголовки и текст окон (дополнительно)" - про что Вы сказали? И где эту ссылку искать?
http://www.autoitscript.com/autoit3/docs/intro/windowsadvanced.htm
Надо внимательно читать заголовки окон и соблюдать регистр букв
Из вашего примера:
Код:
ShellExecute("f:\Scripts\text.txt", "", "", "edit")
WinMenuSelectItem("text - ", "", "&Файл", "Пара&метры страницы" )

заголовок блокнота выглядит по другому: "text.txt - Блокнот" или "text.txt - Notepad", значит, нужно искать заголовок типа:
"text", "text.txt", "text.txt - " и т.д., иначе не будет совпадений, т.к. по умолчанию поиск совпадения ведется с начала строки.
Но это можно изменить:
Значение по умолчанию - проверяет совпадения с начала строки ,т.е. все что есть в WinWait('') должно быть и в искомом заголовке в самом начале заголовка, если там есть что-то еще он это сравнивать не будет:
Код:
Opt('WinTitleMatchMode', 1)

Проверяет совпадения с произвольной частью строки, т.е. то что указано в должно быть в заголвке в любом месте заголовка:
Код:
Opt('WinTitleMatchMode', 2)

Проверяет, чтобы заголовок совпадал полностью - то что указано в WinWait('') должно полностью совпадать с искомым окном:
Код:
Opt('WinTitleMatchMode', 3)

Для включения особых функций при поиске заголовков окна, изучайте самостоятельно :smile:
Код:
Opt('WinTitleMatchMode', 4)
 
Автор
A

andrystepa

Новичок
Сообщения
9
Репутация
0
У меня заголовок выглядит так: text - Блокнот. Но с этим проблем уже нет. Но меня больше интересует Acrobat. Там заголовок окна выглядит так: Form_A3_h.pdf - Adobe Acrobat Pro. Но скрипт:
Код:
ShellExecute("f:\Scripts\Form_A3_h.pdf")
WinWaitActive("Form_A3_h.pdf", "")
WinMenuSelectItem("Form_A3_h.pdf", "", "&Редактирование", "Установ&ки...")
Файл открывает, но пункт меню Редактирование -> Установки не открывает. При этом вместо Form_A3_h.pdf я подставлял и Form_A3_h.pdf - Adobe Acrobat Pro. Результат тот же.
Но ведь заголовки совпадают точно! И регистр букв в них тоже!
За ссылку большое спасибо!
 

VladUs

Скриптер
Сообщения
621
Репутация
181
Здесь может дело и не в заголовке окна...
Может быть скрипт не может найти элемент меню.
Проверьте так:

Код:
ShellExecute("f:\Scripts\Form_A3_h.pdf")
$hwnd = WinWaitActive("Form_A3_h.pdf", "")
;$WinTitle = WinGetTitle($hwnd  ) 
;ConsoleWrite("Заголовок окна "  &  $WinTitle & @CRLF)
$Menu = WinMenuSelectItem("Form_A3_h.pdf", "", "&Редактирование", "Установ&ки...")

If $Menu = 0 Then 
    MsgBox(1,"","Требуемое меню не найдено" & @CRLF)
Else
    MsgBox(1,"","Требуемое меню  найдено" & @CRLF)
EndIf
 
Автор
A

andrystepa

Новичок
Сообщения
9
Репутация
0
Попробовал. Действительно не находит меню. Пробовал и так:
Код:
$Menu = WinMenuSelectItem("Form_A3_h.pdf", "", "&Файл")
Тоже не находит. Пробовал подставлять вместо &Файл название каждого пункта верхнего меню - не находит ни один.
В чем может быть причина?
 
Автор
A

andrystepa

Новичок
Сообщения
9
Репутация
0
Мне надо было в Adobe Acrobat выбрать пункт меню:
Дополнительно -> Обработка документа -> пакетная обработка. Сделал так:
Код:
ShellExecute("f:\Scripts\Form_A3_h.pdf")
WinWaitActive("Form_A3_h.pdf", "")
Send("{F10}")
Send("{RIGHT}")
Send("{RIGHT}")
Send("{RIGHT}")
Send("{RIGHT}")
Send("{RIGHT}")
Send("{RIGHT}")
Send("{RIGHT}")
Send("{DOWN}")
Send("{DOWN}")
Send("{DOWN}")
Send("{DOWN}")
Send("{DOWN}")
Send("{DOWN}")
Send("{DOWN}")
Send("{DOWN}")
Send("{DOWN}")
Send("{RIGHT}")
Send("{ENTER}")
И все открылось как надо. Оно конечно работает, но получается, как-то через нижний проход. Так что вопрос все-таки остается:
почему не срабатывает WinMenuSelectItem?
 

VladUs

Скриптер
Сообщения
621
Репутация
181
Что касается нахождения элемента меню, то в справке есть замечание по этому поводу.
Суть его примерно в том, что функция WinMenuSelectItem() работает для стандартных меню. Некоторые программы используют свои меню, которые лишь эмулируют стандартное windows - меню. Поэтому поиск меню может быть неудачным. И мне кажется , что это как раз Ваш случай.

Что касается как это можно решить. Как правило у каждого элемента меню есть своя горячая клавиша. Вот я бы делал примерно так

Код:
ShellExecute("f:\Scripts\Form_A3_h.pdf")
$hwnd = WinWaitActive("Form_A3_h.pdf", "")
Sleep(2000)
Send("^q") ; отправляем горячую клавишу выхода (Ctrl+Q)


Если у необходимого элемента отсутствует горячая клавиша, тогда придется извращаться как Вы уже делали... Только я бы использовал MouseClick(). Так быстрее.

И в Вашем коде не надо каждый раз набирать повторы Send.
Достаточно было так:

Код:
ShellExecute("f:\Scripts\Form_A3_h.pdf")
WinWaitActive("Form_A3_h.pdf", "")
Send("{F10}")
Send("{RIGHT 7}")
Send("{DOWN 9}")
Send("{RIGHT}")
Send("{ENTER}")
 
Автор
A

andrystepa

Новичок
Сообщения
9
Репутация
0
Я с самого начала пытался выбирать меню именно с помощью быстрых клавиш. Да вот только на их посылку ни Блокнот ни Acrobat не реагировали. Почему - не знаю. Возможно, дело в том, что и Блокнот и Adobe Acrobat русифицирован и все быстрые клавиши должны быть с русскими буквами. А у меня по умолчанию стоит английская раскладка клавиатуры. Так что когда запускается любая программа, раскладка переключается на английскую. И нажатие любой быстрой клавиши на клавиатуре не возымеет никакого действия. Возможно и при посылке команды:
Код:
Send("!Д")
происходит то же самое. А вот как переключить раскладку клавиатуры я не знаю. Пытался перед Send("!Д") вставить команду:
Код:
Send("+{LCTRL}")
Send("!Д")
Не помогает. Раскладка у меня переключается комбинацией CTRL+SHIFT.
 
Верх