AppActivate Method ссылка:
активирует окно приложения.
- Синтаксис:
object.AppActivate title
- Аргументы:
- объект:
WshShell
объект.
- title: Указывает, какое приложение необходимо активировать. Это может быть строка, содержащая заголовок приложения (как указано в в строке заголовка) или приложения ID процесса.
Убедитесь, что строка подается на objShell.AppActivate
либо название желаемого экземпляра из Program.exe
или это идентификатор процесса.
В дополнение к SendKeys Method ссылка, читайте Sending Keystrokes to a Program. Эта статья объясняет фундаментальную недостаточность вашалюбых сценария - временная проблема:
Вы должны знать, что отправка нажатий клавиш в приложении не оптимальный метод для автоматизации процедуры. Если у вас есть приложение на вашем предприятии, которое вам необходимо автоматизировать, и у него нет объектной модели на основе COM , вы можете рассмотреть эту технику. Тем не менее, вы должны сначала проверить, существуют ли другие методы для автоматизации это конкретное приложение.
Хотя SendKeys
могут быть эффективно использованы, есть несколько потенциальных проблемы с этим подходом:
- Сценарий может быть трудно определить, какое окно для отправки нажатий клавиш.
- Поскольку приложение работает в режиме графического интерфейса пользователя, пользователь может закрыть приложение преждевременно. К сожалению, это не приведет к завершению сценария , и сценарий может в конечном итоге отправить нажатия клавиш на неправильное приложение.
- Сценарий может быть затруднен синхронизацией с приложением.
Этот вопрос синхронизации особенно хлопот, просто потому, что сценарии имеют тенденцию работать намного быстрее, чем приложения с графическим интерфейсом.
...
и использованием AppActivate
:
Перед отправкой нажатий клавиш в приложение, вы должны сначала убедиться , что приложение работает и что фокус находится на приложения (то есть, приложение работает в активном окне ).
...
Вы можете разместить свой скрипт в цикле, периодически вызывать AppActivate, пока возвращаемое значение не будет True. В этот момент приложение загружается и готово к принятию нажатий клавиш.
...
Когда сценарий определяет, какое приложение активировать, данный заголовок сравнивается с названием каждого окна, видимого на экране. Если нет точного соответствия, метод AppActivate
устанавливает фокус на первое окно, название которого начинается с данного текста.Если окно еще не найдено, первое окно, строка заголовка которого заканчивается , текст получает фокус. Частичное совпадение с ведущим и завершающим текстом заголовков гарантирует, что AppActivate
работает с приложениями , такими как «Блокнот», которые отображают имя открытого в данный момент документа в строке заголовка. (Например, при первом запуске Notepad
, заголовок окна Untitled - Notepad
, не Notepad
.)
...
(Выше цитаты дайджест только со своими акцентами: слишком долго цитировать всю статью здесь.)
Редактировать.
Давайте лицевая сторона вверх, что SendKeys
метод отправляет нажатие клавиши (ы) для активного окна взгляда невидимой, как на самом деле мы никогда не знаем какого окна в настоящее время сосредоточены. Воспользоваться от Run Method (Windows Script Host) полного синтаксиса objShell.Run sCmdLine, 1, False
где стиль окна 1
смысла
1
Активизирует и отображает окно. Если окно минимизировано или максимизировано, система восстанавливает его до его первоначального размера и . Приложение должно указать этот флаг при отображении окна в первый раз.
Испытан с помощью следующего сценария образца (с комментариями для лучшего понимания):
option explicit
On Error GoTo 0
Dim objShell, sProgram, sTxtFile, sTxtPath, sCmdLine, sTxtExists
Set objShell = WScript.CreateObject("WScript.Shell")
sProgram = "C:\Windows\System32\notepad.exe"
sTxtFile = Replace(Wscript.ScriptName, ".vbs", ".txt", 1, -1, vbTextCompare)
sTxtPath = CreateObject("Scripting.FileSystemObject").BuildPath(_
objShell.ExpandEnvironmentStrings("%temp%"), sTxtFile)
sTxtExists = CreateObject("Scripting.FileSystemObject").FileExists(sTxtPath)
' delete file merely for testing and debugging to ensure that
' `NOTEPAD` will ask whether create nonexistent file
If sTxtExists Then CreateObject("Scripting.FileSystemObject").DeleteFile(sTxtPath)
WScript.Sleep 500 ' wait for deleting
sCmdLine = """" & sProgram & """ """ & sTxtPath & """"
objShell.Run sCmdLine, 1, False
' this `1` activates currently launched notepad
' and its possible initial dialogue takes focus
WScript.Sleep 1000 ' hence, `AppActivate` is not necessary
' alternative to `DeleteFile(sTxtPath)`
' If NOT sTxtExists Then ' answer initial dialogue only if necessary
objShell.SendKeys "{TAB}"
WScript.Sleep 100
objShell.SendKeys "{TAB}"
WScript.Sleep 100
objShell.SendKeys "{TAB}"
WScript.Sleep 100
objShell.SendKeys "{ENTER}"
WScript.Sleep 100
' End If
objShell.SendKeys Cstr(Now)
WScript.Sleep 100
Однако, есть еще один время и фокуса проблемы в вашем пусковой установке. Может ли Python time.sleep(2)
? Наверняка нет: каждый vbs
сценарий ждет 3 секунды до первого SendKeys
, но следующий запускается каждые 2 секунды!
Исходный эквивалент пакетного сценария: Timeout
command приостанавливает командный процессор на указанное количество секунд.
Продольный 1>NUL
hides output отсчет Waiting for X seconds, press CTRL+C to quit ...
for /r "." %%a in (*.vbs) do (
C:\Windows\System32\wscript.exe "%%~fa"
timeout /T 5 /NOBREAK 1>NUL
)
Would 5 секунд хватает?
Я пробовал это, но я не думаю, что он решает проблему, которую я хочу решить. –
это не DOS, это пакет окон. –