【发布时间】:2011-04-12 02:39:38
【问题描述】:
在 JScript 中是否有任何方法可以通过提供进程名称来获取进程主窗口的句柄? Process.MainWindowHandle 属性仅适用于 JScript .NET。经典 JScript 中是否有类似的功能?
【问题讨论】:
标签: windows scripting wsh window-handles jscript
在 JScript 中是否有任何方法可以通过提供进程名称来获取进程主窗口的句柄? Process.MainWindowHandle 属性仅适用于 JScript .NET。经典 JScript 中是否有类似的功能?
【问题讨论】:
标签: windows scripting wsh window-handles 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 对象、命令行工具等)来提供此功能,并从您的脚本中调用此工具。
编辑:所以你需要关闭窗口——这是一个 UI 自动化任务。
Windows 脚本宿主提供的 UI 自动化功能非常有限。如果您知道窗口标题,您可以尝试使用AppActivate to 和SendKeys 方法来激活该窗口并将Alt+F4 快捷方式发送给它。你可以找到一个例子this answer。 (代码是用 VBScript 编写的,但它应该能让您有所了解。)但是,这种方法并不可靠。
如果您真的不想杀死进程,最简单的解决方案是使用一些第三方 UI 自动化工具。例如,您可以尝试免费的AutoIt 工具——我认为它应该能够满足您的需求。
编辑 2:您是否尝试过记录窗口的关闭?你应该得到一个这样的脚本:
Sys.Process("notepad").Window("Notepad", "Untitled - Notepad").Close();
这不是你需要的吗?
【讨论】:
对于本机 win32 应用程序,没有“主窗口”之类的东西。一个进程可以没有窗口,也可以有多个顶级“主”窗口。
【讨论】:
好吧,一旦我不得不为 Outlook 编写一个加载项。我的老板希望在 Outlook 加载时出现闪屏。但是 Outlook 窗口越过了飞溅。经过大量搜索,我找到了FindWindowhttp://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-invoked 它并从 C# 中使用它。如果您可以通过 JScript 使用此功能,我认为它可以为您完成这项工作。 (我使用 Spy++ 查找lpClassName 参数)
【讨论】: