Как получить дескриптор главного окна процесса с использованием JScript? - PullRequest
2 голосов
/ 14 сентября 2010

Есть ли в JScript какой-либо метод, позволяющий получить дескриптор главного окна процесса путем предоставления имени процесса?Свойство Process.MainWindowHandle работает только в JScript .NET.Есть что-нибудь подобное в классическом JScript?

Ответы [ 4 ]

0 голосов
/ 30 сентября 2010

Ну, однажды мне пришлось написать надстройку для 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, это поможет.Эта функция находит окно на основе заголовка окна и имени класса окна.Я вызвал его и использовал его из C #.Если вы можете использовать эту функцию через JScript, я думаю, что она может сделать эту работу за вас.(Я использовал Spy ++ для поиска параметра lpClassName)

0 голосов
/ 14 сентября 2010

JScript и Windows Script Host не имеют этой функции, как и WMI.

Если вам подходит PowerShell, вы можете использовать свойство Process.MainWindowHandle, которое вы упомянули:

(Get-Process notepad).MainWindowHandle

В противном случае вам нужно найти или написать утилиту (COM-объект, инструмент командной строки и т. Д.), Которая обеспечивала бы эту функциональность, и вызвать этот инструмент из вашего скрипта.


Редактировать: Так что вам нужно закрыть окно - это задача автоматизации пользовательского интерфейса.

Windows Script Host обеспечивает очень ограниченную функциональность автоматизации пользовательского интерфейса. Если вы знаете заголовок окна, вы можете попробовать использовать методы AppActivate to и SendKeys, чтобы активировать это окно и отправить Alt + F4 ярлык к нему. Вы можете найти пример этот ответ . (Код написан на VBScript, но он должен дать вам представление.) Однако этот подход ненадежен.

Если вы действительно не хотите убивать процесс, самое простое решение - использовать какой-либо сторонний инструмент автоматизации пользовательского интерфейса. Например, вы можете попробовать бесплатный инструмент AutoIt - я думаю, что он сможет выполнить то, что вам нужно.


Редактировать 2: Вы пытались записать закрытие окна? Вы должны получить такой скрипт:

Sys.Process("notepad").Window("Notepad", "Untitled - Notepad").Close();

Разве это не то, что вам нужно?

0 голосов
/ 17 сентября 2010

Для родного приложения win32 не существует такого понятия, как «главное окно».Процесс может не иметь окон или нескольких «главных» окон верхнего уровня.

0 голосов
/ 14 сентября 2010

Я не уверен, что это работает, просто попробуйте зациклить window.parent до тех пор, пока он не будет определен.

что-то вроде -

var mainWindow = window;
while( mainWindow.parent ) {
    mainWindow = mainWindow.parent;
}

у вас также есть что-то вроде window.top, которое всегдавозвращает вам самое верхнее окно.Но не уверен, что это поддерживается всеми браузерами.

...