WScript.Shell AppActivate не работает каждый раз - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть несколько сценариев, которые помогут запустить программу в CMD.Первый скрипт, запускающий последовательность, запускается при запуске.В процессе я запускаю VBScript, с помощью которого я пытаюсь сосредоточиться на CMD и сделать его полноэкранным.Однако иногда это работает, а иногда нет, и я ничего не меняю, просто перезагружаю компьютер снова и снова.Он не всегда фокусируется на окне cmd, поэтому проблема должна быть в методе AppActivate.

Вот код первого скрипта, который запускается при запуске:

@echo off
TITLE masterBat
START "Master" /B /W myApp.bat
shutdown.exe /s /t 00

Вот код для myApp.bat:

@echo off
cscript fullscreen.vbs
cd <path>
CMD /C <command>
exit

Вот код для fullscreen.vbs:

Set ws = WScript.CreateObject("WScript.Shell")
ws.AppActivate "masterBat - myApp.bat"
ws.SendKeys "{F11}"
Set ws = Nothing

Заголовок в вызове AppActivate - это заголовок на cmdкогда я пытаюсь сделать его полноэкранным.Я также попытался добавить в скрипт некоторые вызовы WScript.Sleep, но, похоже, это не помогло.

1 Ответ

0 голосов
/ 19 сентября 2018

Wscript.sleep ухудшит ситуацию. Ты не хочешь спать.

Есть правила. Ваша программа ДОЛЖНА придерживаться одного из этих правил, чтобы иметь возможность устанавливать переднее окно.

С https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setforegroundwindow

Система ограничивает, какие процессы могут устанавливать окно переднего плана. Процесс может установить приоритетное окно, только если выполняется одно из следующих условий:

• Процесс является приоритетным процессом.

• Процесс был запущен процессом переднего плана.

• Процесс получил последнее входное событие.

• Процесс переднего плана отсутствует.

• Процесс отлаживается.

• Процесс переднего плана не является современным приложением или началом Экран.

• Передний план не заблокирован (см. LockSetForegroundWindow).

• Истекло время ожидания блокировки переднего плана (см. SPI_GETFOREGROUNDLOCKTIMEOUT в SystemParametersInfo).

• Нет активных меню.

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

Это означает, что у вас есть две секунды (FOREGROUNDLOCKTIMEOUT) с момента, когда ваш скрипт начинает устанавливать другое окно, если ваш скрипт не имеет пользовательского интерфейса (так как он не может быть окном переднего плана). Окно сообщения как первое, что вы сделаете, будет соответствовать (пока что-то еще не произойдет). Также в Wscript есть окно сообщения, время ожидания которого истекло - WshShell.Popup.

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

Превентивный комментарий Обычно люди хотят спорить со мной об этом. Пожаловаться на Microsoft не мне. И вы не можете спорить с правилами. Вы можете просто соблюдать их.

...