Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - (vbs) WScript.Shell.Terminate() => 80070578 "Недопустимый дескриптор окна"

Ответить
Настройки темы
VBS/WSH/JS - (vbs) WScript.Shell.Terminate() => 80070578 "Недопустимый дескриптор окна"

Аватара для CyraxZ

Ветеран


Сообщения: 780
Благодарности: 11

Профиль | Отправить PM | Цитировать


Задача: запустить и закрыть окно Lingvo x6

Код: Выделить весь код
Set WshShell = CreateObject("WScript.Shell")
Set WshExec = WshShell.Exec("""C:\Program Files (x86)\ABBYY Lingvo x6\Lingvo.exe""")
WScript.Sleep 2000
WshExec.Terminate()
Этот код нормально запускает и закрывает окно Lingvo. Но при выполнении метода Terminate выскакивает сообщение об ошибке:
80070578 "Недопустимый дескриптор окна".

P.S. Для чего это нужно. В настройках Lingvo x6 (последняя версия) отсутствует опция "Запускать при загрузке ОС" (в прошлой версии, помню, такая опция была). Так вот, для того, чтобы при запуске Windows 10 Lingvo x6 запускался автоматически, но без открытия окна (только в трее), необходимо открыть и закрыть Lingvo x6. При закрытии окна Lingvo из памяти не выгружается (остаётся значок в трее), т.к. в опциях установлена галка "Не выгружать при закрытии окна".

Отправлено: 21:57, 20-03-2020

 

Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


CyraxZ, Вы путаете две вещи — нажатие на кнопку закрытия окна, которая может быть отработана в приложении, и принудительное снятие процесса извне.

Рекомендую использовать AutoIt или PowerShell и посылать окну сообщение о закрытии, а не снятие процесса.

Отправлено: 23:40, 20-03-2020 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для CyraxZ

Ветеран


Сообщения: 780
Благодарности: 11

Профиль | Отправить PM | Цитировать


Цитата:
CyraxZ, Вы путаете две вещи — нажатие на кнопку закрытия окна, которая может быть отработана в приложении, и принудительное снятие процесса извне.
В msdn (в оригинале) не нашёл, но в других источниках про [WScript.Shell.Terminate] пишут:
"процессу будет послана команда WM_CLOSE, если это не сработает, то процесс будет завершен принудительно"

Временная заплатка для Lingvo (подавляем сообщение об ошибке):
Код: Выделить весь код
Set WshShell = CreateObject("WScript.Shell")
Set WshExec = WshShell.Exec("""C:\Program Files (x86)\ABBYY Lingvo x6\Lingvo.exe""")
WScript.Sleep 2000

On Error Resume Next
WshExec.Terminate()
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:32, 21-03-2020 | #3


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


CyraxZ, приношу Вам свои извинения, попутал с методом .Terminate() класса Win32_Process Wbem.

Я не отслеживал оконные сообщения, но, похоже, что всё происходит именно так (или почти так), как Вы указали.

Цитата CyraxZ:
В msdn (в оригинале) не нашёл »
Они, похоже, ещё несколько лет назад полностью «выпилили» (разумеется, в рамках «оптимизации») всю online-документацию по WSH.

Отправлено: 16:42, 21-03-2020 | #4


Старожил


Сообщения: 352
Благодарности: 192

Профиль | Отправить PM | Цитировать


Цитата Iska:
Они, похоже, ещё несколько лет назад полностью «выпилили» (разумеется, в рамках «оптимизации») всю online-документацию по WSH. »
Нет, просто, как обычно, сунули в пыльный шкаф в углу самого дальнего коридора на нижнем ярусе подвала в забытом офисе. Примерно так.
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:54, 21-03-2020 | #5


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


iglezz, спасибо. Надо теперь запомнить, что кроме MSDN и TechNet надо будет искать и по Docs.

Отправлено: 18:10, 21-03-2020 | #6


Аватара для CyraxZ

Ветеран


Сообщения: 780
Благодарности: 11

Профиль | Отправить PM | Цитировать


Цитата iglezz:
Нет, просто, как обычно, сунули в пыльный шкаф в углу самого дальнего коридора на нижнем ярусе подвала в забытом офисе. Примерно так. »
Вот и в оригинале:

Terminate Method (WshScriptExec)
The Terminate method does not return a value. Use the Terminate method only as a last resort since some applications do not clean up properly. As a general rule, let the process run its course and end on its own. The Terminate method attempts to end a process using the WM_CLOSE message. If that does not work, it kills the process immediately without going through the normal shutdown procedure.


Только вышеприведённый код (Terminate + подавление ошибки) на самом деле нерабочий. Да, окно Lingvo закрывается. Да, ошибка не выскакивает. Да, значок Lingvo появляется в трее. Но при этом сам Lingvo при выполнении Terminate выгружается из памяти, не смотря на снятую галку "Выгружать ABBY Lingvo из памяти при закрытии главного окна" в настройках Lingvo. Судя по наличию ошибки (которую в этом коде мы подавляем), WM_CLOSE по тем или иным причинам не срабатывает (генерируется ошибка 80070578 "Недопустимый дескриптор окна") и выполняется принудительная выгрузка процесса из памяти. Т.е. от варианта с Terminate отказываемся и делаем по-другому.

Вот рабочий вариант скрипта:
Код: Выделить весь код
Set WshShell = CreateObject("WScript.Shell")
Set WshExec = WshShell.Exec("""C:\Program Files (x86)\ABBYY Lingvo x6\Lingvo.exe""")

Do While Not WshShell.AppActivate ("Lingvo")
	WScript.Sleep 300
Loop

WshShell.SendKeys "%{F4}"
Здесь сначала запускается Lingvo x6, затем выполняется ожидание, пока окно программы запустится и получит фокус, затем имитируется нажатие комбинации клавиш Alt+F4 (закрытие текущего окна). И всё: окно закрывается, Lingvo остаётся в памяти, значок в трее присутствует. Можно выполнять перевод слов (согласно настройкам Lingvo x6).

Последовательность действий для автозагрузки Lingvo x6 при старте Windows:
1) В настройках Lingvo x6 cнять галку "Общие" - "Выгружать ABBY Lingvo из памяти при закрытии главного окна"
2) Скопировать вышеприведённый скрипт "Lingvo x6 autorun.vbs" в автозагрузку ("C:\Users\ПОЛЬЗОВАТЕЛЬ\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup")

После этого при запуске OC Windows Lingvo x6 будет автоматически запускаться на уровня трея (не придётся вручную закрывать его окно).

Последний раз редактировалось CyraxZ, 22-03-2020 в 17:08.


Отправлено: 16:59, 22-03-2020 | #7


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


CyraxZ, .AppActivate() в связке с .SendKeys() такое себе… Я бы уж лучше пользовал AutoIt — там это делается надёжнее.
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:54, 22-03-2020 | #8



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - (vbs) WScript.Shell.Terminate() => 80070578 "Недопустимый дескриптор окна"

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
VBS/WSH/JS - как сделать чтобы окна VBS сами себе нажимали на "ок" через некоторое время? yakubovich25@vk Скриптовые языки администрирования Windows 1 03-12-2017 17:09
Интерфейс - [решено] Нет "стеклянного" эффекта при наведении на "Свернуть все окна" aka_smile Microsoft Windows 7 5 21-09-2012 11:49
RAID - Как проверить работоспособность Raid 1, или "Недопустимый динамический диск" x 2 Freez Накопители (SSD, HDD, USB Flash) 3 22-11-2011 13:12
CMD/BAT - как удалить ">" из строки типа “>>…>>c:\program files\dir\mir\doc.skok” akrav Скриптовые языки администрирования Windows 1 14-02-2008 16:35
Ошибка "неправильный дескриптор файла" на Win XP SP2 D1ON1S Microsoft Windows 2000/XP 0 28-03-2007 21:20




 
Переход