1

Тема: Поиск и активизация дочернего окна приложения с помощью vbs

Всем доброго дня, пытаюсь реализовать такую тему: вставка содержимого буфера обмена(путь до папки) в тело письма почтовой программы Thunderbird, в виде ссылки. На данный момент всё это дело я с горем пополам реализовал в виде 3-х скриптов, один из которых написан на AutoIt и представляет из себя одну строчку кода - WinActivate("Создание сообщения: - - Thunderbird", "").

Первый скрипт создаёт новое сообщение и вставляет в него ссылку

		Set WshShell = CreateObject("WScript.Shell")	
		WshShell.Run ("""C:\Program Files (x86)\Mozilla Thunderbird\thunderbird.exe""")
		WshShell.Run ("""R:\Recovery\ActivateWindow.au3""") ' запускаем скрипт на AutoIt, если окно с указанным Title существует - оно активируется, если нет  - код продолжается
		WScript.Sleep 1000
		
		ctrlNeng = "^n"
		ctrlNrus = "^т"
		ctrlKeng = "^k"
		ctrlKrus = "^л"
		ctrlVeng = "^v"
		ctrlVrus = "^м"
		
		WshShell.SendKeys(ctrlNeng)
		WshShell.SendKeys(ctrlNrus)  ' создаём новое исходящее сообщение
		
		WScript.Sleep 500
		WshShell.SendKeys("{TAB}")
		WScript.Sleep 500
		WshShell.SendKeys("-") ' в поле Тема вставляем символ "-",  так как он одинаковый на рус. и анг. раскладке
		WScript.Sleep 500
		WshShell.SendKeys("{TAB}")
		WScript.Sleep 500

		WshShell.SendKeys(ctrlKeng)
		WshShell.SendKeys(ctrlKrus) ' имитируем нажатие на двух раскладках ctrll+K - открытие окна создания ссылки
		
		WScript.Sleep 300
		WshShell.SendKeys("{TAB}") 
		WshShell.SendKeys(ctrlVeng) 
		WshShell.SendKeys(ctrlVrus)  ' вставляем содержимое буфера(путь до папки)
		WScript.Sleep 300

		WshShell.SendKeys("{TAB 4}") 'перемещаемся на кнопку ОК - завершение создания ссылки
		WshShell.SendKeys("{ENTER}") 'подтверждаем нажатие кнопки ОК
		
		WScript.Sleep 300
		WshShell.SendKeys("{ENTER}") 'смещаемся на строчку вниз

Второй скрипт используется если нужно добавить ссылку в уже созданное сообщение(ссылка вставляется под предыдущей), для этого из основного вызывается скрипт на AutoIt

Set WshShell = CreateObject("WScript.Shell")
		
		WshShell.Run ("""C:\Program Files (x86)\Mozilla Thunderbird\thunderbird.exe""")
		WshShell.Run ("""R:\Recovery\ActivateWindow.au3""")
		WScript.Sleep 1000
		
		ctrlKeng = "^k"
		ctrlKrus = "^л"
		ctrlVeng = "^v"
		ctrlVrus = "^м"
		
		WshShell.SendKeys(ctrlKeng)
		WshShell.SendKeys(ctrlKrus)
		
		WScript.Sleep 300
		WshShell.SendKeys("{TAB}") 
		WshShell.SendKeys(ctrlVeng) 
		WshShell.SendKeys(ctrlVrus)
		WScript.Sleep 300
		
		WshShell.SendKeys(ctrlVeng)
		WshShell.SendKeys(ctrlVrus)
		WScript.Sleep 300
		
		WshShell.SendKeys("{TAB 4}")
		WshShell.SendKeys("{ENTER}")
		
		WScript.Sleep 300
		WshShell.SendKeys("{ENTER}")

Проблема заключается в том, что необходимо обойтись без сторонних библиотек(т.е. без AutoIt) и добавить условие проверки существования уже созданного окна, дабы соединить 3 скрипта в один. Как активизировать окно нового сообщения? т.е. это процесс не основного приложения Thunderbird.exe, а его дочернее окно, замечу, что Title этого окна будет всегда одинаковым, так как создаётся программно. Пробовал активизировать нужное мне окно вот так, но это ни к чему не привело, похоже что ProcessID -  в данном случае, это процесс основного окна!

Set WshShell = CreateObject("WScript.Shell")
Set WshExec = WshShell.Exec("""C:\Program Files (x86)\Mozilla Thunderbird\thunderbird.exe""") ' запускаем почтовик
WScript.Sleep 2000
WshShell.SendKeys("^n") ' создаём новое сообщение
WScript.Sleep 500
PID = WshShell.AppActivate(WshExec.ProcessID) ' получаем ID процесса нужного окна
WshShell.Run("notepad") ' запускаем ради эксперимента окно блокнота поверх почтовика
If PID Then  ' по идее эта строчка должна активизировать нужное окно по его ID
WshShell.SendKeys("^k") ' вызываем окно создания ссылки
Else
MsgBox "Что-то пошло не так!"
End if

2

Re: Поиск и активизация дочернего окна приложения с помощью vbs

Зачем такие извращения?! Лучше опишите Вашу задачу (а не уже выбранное решение).

3

Re: Поиск и активизация дочернего окна приложения с помощью vbs

alexii Скрипт будет запускаться из меню правой кнопки мыши(клик по папке):
1) Скопировать путь до папки
2) Создать новое письмо в Thunderbird
3) Вставить в него ссылку на папку(из буфера обмена)
4) Скопировать путь до другой папки
5) Вставить ссылку на папку в то же письмо, ниже первой ссылки
конец скрипта, дальше пользователь руками выбирает адресата и жмёт отправить.

4

Re: Поиск и активизация дочернего окна приложения с помощью vbs

Дмитрий_DimAs: А чем не подходит объект CDO.Message для отправки писем напрямую ? O_o

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

5 (изменено: Дмитрий_DimAs, 2019-12-11 20:37:06)

Re: Поиск и активизация дочернего окна приложения с помощью vbs

Xameleon Это наша корпоративная почта(Thunderbird) и нужно все письма отправлять через него. Мне помогли в этом направлении, сейчас вот что имею

Function Zamena(x)
Zamena = Replace(x, " ", "%20")
End Function

Set FSO = CreateObject("Scripting.FileSystemObject")
For Each FTR In wscript.Arguments
   		Folder = FSO.GetAbsolutePathName(FTR)
    	FolderZ = "file:///" & Zamena(FSO.GetAbsolutePathName(FTR))   
Next

Set WshShell = CreateObject("WScript.Shell")
Thunder = """C:\Program Files (x86)\Mozilla Thunderbird\thunderbird.exe"" -compose body='Любой текст',to=test@mail.ru,subject=test,attachment='file:///C:\Users\Desktop\Test.docx'"
Set WshExec = WshShell.Exec(Thunder)
WScript.Sleep 500
WshShell.SendKeys ("^k")
WshShell.SendKeys ("^л")
WScript.Sleep 500
WshShell.SendKeys (Folder)
'WshShell.SendKeys ("^м")
WshShell.SendKeys ("{TAB}")
WScript.Sleep 500
WshShell.SendKeys (FolderZ)

Кто-нибудь знает как через ком.команду -compose, создать письмо сразу с нужной ссылкой, типа -compose href? поискал ком.команды для Thunderbird насчёт ссылок - ничего.
И второй вопрос как передать значение переменных Folder и FolderZ напрямую в WshShell.SendKeys (Folder) без потерь, потомучто как на русской раскладке они вставляются как кракозябры. Решение я вижу либо в переключении раскладки перед вставкой, либо через буфер обмена и потом WshShell.SendKeys("^v") - этот вариант пробовал работает, но громоздкий.

6

Re: Поиск и активизация дочернего окна приложения с помощью vbs

Дмитрий_DimAs, да какая бы она не была @_@. Кто Вам запрещает использовать встроенный в Windows абсолютно адекватный COM компонент для отправки той же самой почты. Я тоже пользуюсь корп. почтой. И никаких проблем с CDO.Message при этом не испытываю. Поясню - вариант автоматизации, который Вы используете, крайне неэффективен и ненадёжен. Любые эмуляции нажатия кнопок таким способом это рандомное (непредсказуемое) поведение скрипта. Всё равно что Вы бы посадили слепоглухонемого человека за комп и поручили ему что-то делать. На экране, в процессе работы, могут появляться окна, всплывающие сообщения, диалоговые запросы и чёрт ещё знает что, что тут же собьёт скрипт с его работы. Автоит или AHK от части решают эту проблему за счёт связи с окнами, отправки нажатий и прочих событий по хэндлу контролов, но это В ЛЮБОМ случае самый крайний вариант. В Вашем случае, как мне видится, CDO.Message самый простой вариант автоматизации, чтобы не ломать себе голову и не изобретать велосипед. Тем более примеров на форуме полно, как его использовать.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !