【问题标题】:How to get the main window handle of a process using JScript?如何使用 JScript 获取进程的主窗口句柄?
【发布时间】:2011-04-12 02:39:38
【问题描述】:

在 JScript 中是否有任何方法可以通过提供进程名称来获取进程主窗口的句柄? Process.MainWindowHandle 属性仅适用于 JScript .NET。经典 JScript 中是否有类似的功能?

【问题讨论】:

    标签: windows scripting wsh window-handles jscript


    【解决方案1】:

    我不确定这是否有效,请尝试循环 window.parent 直到其未定义。

    类似-

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

    你也有类似window.top 的东西,它总是返回最上面的窗口。但不确定是否所有浏览器都支持。

    【讨论】:

    • 我使用与 Sachin 相同的循环来确保我把手放在最上面的窗口上。它很简单。
    • Sachin,我没有任何子窗口的句柄。我只有进程名称。我认为上面的循环将迭代直到父窗口返回未定义。如果我的假设是错误的,请纠正我。
    • @rainbow365 - 你不需要任何子窗口句柄来使用窗口对象。它总是返回您当前正在处理的当前窗口。检查这个 - msdn.microsoft.com/en-us/library/ms535873(v=VS.85).aspx
    • 谢谢萨钦。但我有不同的要求。我不需要“当前”窗口的主窗口句柄。我需要作为输入传递或提供的进程的主窗口句柄。
    • @Dick:从 OP 的帖子来看,她/他似乎没有使用浏览器脚本。 JScript 是一种 Windows shell 脚本语言。
    【解决方案2】:

    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();
    

    这不是你需要的吗?

    【讨论】:

    • 感谢海伦的回复。我想关闭名称为 xyz.exe 的进程的主窗口。我不想使用 terminate() 方法,因为这会终止进程而不是正式关闭应用程序。如果有其他方法可以关闭应用程序而不是终止或终止进程,那对我来说很好。
    • 对不起,海伦,我忘了提。我正在使用测试完成工具来关闭窗口。所以我可以使用该工具自动完成关闭过程。我唯一需要的是获取窗口的标题,以便我将其传递给自动化工具以关闭它。由于可能存在多个同名进程(每个进程都有其主窗口。例如:iexplore.exe),我想通过将进程名称作为输入发送来以某种方式提取窗口的标题。
    • @rainbow365 注意:您应该始终在原始问题中包含此类详细信息。人们不是心灵感应者,不知道细节将无法为您提供帮助。
    【解决方案3】:

    对于本机 win32 应用程序,没有“主窗口”之类的东西。一个进程可以没有窗口,也可以有多个顶级“主”窗口。

    【讨论】:

      【解决方案4】:

      好吧,一旦我不得不为 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 参数)

      【讨论】:

        猜你喜欢
        • 2010-12-25
        • 1970-01-01
        • 2011-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多