Есть ли какой-либо метод в JScript, чтобы получить дескриптор главного окна процесса, указав имя процесса? Свойство Process.MainWindowHandle
работает только в JScript .NET. Есть ли что-либо подобное в классическом JScript?Как получить дескриптор главного окна процесса с использованием JScript?
ответ
Я не уверен, что это работает, просто попробуйте петлю window.parent
до ее неопределенного.
что-то вроде -
var mainWindow = window;
while(mainWindow.parent) {
mainWindow = mainWindow.parent;
}
у вас также есть что-то вроде window.top
который всегда возвращает вам самое верхнее окно. Но не уверен, поддерживается ли это всеми браузерами.
JScript и Windows Script Host не имеют этой функции, и WMI также не имеет.
Если PowerShell вариант для вас, то вы можете использовать Process.MainWindowHandle
свойство, которое вы упомянули:
(Get-Process notepad).MainWindowHandle
В противном случае, вам нужно найти или написать утилиту (COM объект, инструмент командной строки и т.д.), который предоставит эту функциональность и вызовет этот инструмент из вашего скрипта.
Edit: Так что вам нужно, чтобы закрыть окно - это задача автоматизации пользовательского интерфейса.
Windows Script Host обеспечивает очень ограниченную функциональность автоматизации пользовательского интерфейса. Если вы знаете название окна, вы можете попробовать использовать методы AppActivate
и SendKeys
для активации этого окна и отправить Alt + F4 ярлык на него. Вы можете найти пример this answer. (Код находится в VBScript, но он должен дать вам эту идею.) Однако этот подход не является надежным.
Если вы действительно не хотите убивать процесс, самым простым решением является использование стороннего инструмента автоматизации пользовательского интерфейса. Например, вы можете попробовать бесплатный инструмент AutoIt - я думаю, он должен быть в состоянии выполнить то, что вам нужно.
Edit 2: Вы пробовали запись закрытия окна? Вы должны получить такой скрипт:
Sys.Process("notepad").Window("Notepad", "Untitled - Notepad").Close();
Разве это не то, что вам нужно?
Спасибо, Елена за ответ. Я хочу закрыть главное окно процесса, имя которого называется xyz.exe. Я не хочу использовать метод terminate(), поскольку это убьет процесс, а не официально закрывает приложение. Для меня это хорошо, если есть другие способы закрыть приложение, а не убить или прекратить процесс. – satya
Извините, Хелен, я забыл упомянуть. Я использую Test complete tool для закрытия окна. поэтому я могу автоматизировать процесс закрытия с помощью инструмента. Единственное, что мне нужно - это получить заголовок окна, чтобы я передал его инструменту автоматизации, чтобы закрыть его. Поскольку может быть более одного процесса, существует одноименное имя (у каждого есть свое главное окно, например: iexplore.exe). Я хочу как-то извлечь заголовок окна, посылая имя процесса в качестве входного. – satya
@ rainbow365 Примечание: вы всегда должны включать такие детали в свои исходные вопросы. Люди не являются телепатами и не знают, что детали не смогут вам помочь. – Helen
Для родного приложения win32 нет такого понятия, как «главное окно». Процесс может не иметь окон вообще или нескольких главных «главных» окон верхнего уровня.
Ну, однажды мне пришлось написать надстройку для Outlook. Мой босс хочет, чтобы при загрузке Outlook появлялся всплывающий экран. Но окно Outlook просматривает всплеск. После большого поиска я нашел FindWindow
http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=EN-US&k=k%28FINDWINDOW%29%3bk%28TargetFrameworkMoniker-%22.NETFRAMEWORK%2cVERSION%3dV4.0%22%29%3bk%28DevLang-CSHARP%29&rd=true это поможет. Эта функция находит окно на основе заголовка окна и имени класса окна. Я p-вызвал его и использовал его с C#. Если вы можете использовать эту функцию через JScript, я думаю, что она может выполнить эту работу за вас. (Я использовал Spy ++ для определения параметра lpClassName
)
Я использую ту же петлю, что и Sachin, чтобы убедиться, что я руки в самом верхнем окне. Это просто работает. –
Sachin, у меня нет ручки ни одному из дочерних окон. У меня только имя процесса. Я думаю, что вышеуказанный цикл будет повторяться до тех пор, пока родительское окно не вернется в неопределенное состояние. Пожалуйста, поправьте меня, если мое предположение ошибочно. – satya
@ rainbow365 - вам не нужно иметь обработчик дочернего окна, чтобы использовать объект окна. Он всегда возвращает вам текущее окно, в котором вы сейчас работаете. Проверьте это - http://msdn.microsoft.com/en-us/library/ms535873(v=VS.85).aspx –