使用 vbscript 激活(置于前台)特定的 window

Activating (bring to foreground) a specific window with vbscript

我什至不确定从哪里开始我的问题,我尝试了一百件事并在谷歌上搜索了几个小时,但没有找到任何有用的东西。 (我对所有肮脏的把戏都持开放态度。)

这是我的问题:

我有一个 .hta 文件,其中的列表框如下所示:

它列出了我的 SAP Gui 运行 的所有 sessions/modi。

        Set SapGuiAuto  = GetObject("SAPGUI")
        Set application = SapGuiAuto.GetScriptingEngine

        If application.Connections.Count > 0 Then
            Set connection  = application.Children(0)

            If connection.Sessions.Count > 0 Then
                Set session = connection.Children(0)
            End If
        End If


        If IsObject(WScript) Then
            WScript.ConnectObject session,     "on"
            WScript.ConnectObject application, "on"
        End If

Set optGroup = Document.createElement("OPTGROUP")
    optGroup.label = "Server"


    'count all connected servers 
    ConnectionCount = application.Connections.Count




        If ConnectionCount > 0 Then
            Sessionlist.appendChild(optGroup)

            Else 
            optGroup.label = "No connection here."


        End If
        'count all sessions per server


        If ConnectionCount > 0 Then
            For Each conn in application.Connections

                'Text output connections and sessions

                SessionCount = conn.Sessions.Count
                whatIsIt  = conn.Description
                ConnectionFeld.innerhtml = ConnectionFeld.innerhtml & " <br> " & SessionCount & " Sessions auf " & whatIsIt

                'fill listbox with all connections

                Set objOption = nothing
                Set optGroup = Document.createElement("OPTGROUP")
                optGroup.label = conn.Description
                Sessionlist.appendChild(optGroup)

                i = 0

                    'fill listbox with all sessions
                    For Each sess In conn.Sessions

                        i = i + 1
                        Set objOption = Document.createElement("OPTION")

                            objOption.Text = "Session " & i & ": " & sess.ID
                            objOption.Value = sess.ID
                            SessionList.options.add(objOption)

                    Next
            Next

        Else 

        Exit Sub

        End If

我的目标:当我双击该列表中的一个条目时,我的 SAP Gui 的选定实例应该 foreground/get 激活。

不幸的是,我的任务管理器只列出了一项任务,那就是 "SAP Logon"。我打开的其中一个 windows 也有名称 "SAP Logon",其他的都具有相同的名称:"SAP Easy Access"。

我可以查看连接 ID(服务器名)和会话 ID 的唯一方法是使用 vbscript 提取它们。 (见上文)

有什么办法吗?在尝试了一千种解决方案后,我能想到的唯一解决方法是这两个:

极其丑陋的解决方法:

If sessionID = sess.ID Then

Set objShell = CreateObject("shell.application")
objShell.MinimizeAll

sess.findById("wnd[0]").maximize

End If

它最小化所有 windows,然后最大化所选 SAP window。不幸的是,我的 HTA-GUI 也被最小化了,这有点糟糕。

第二个想法:

以某种方式通过快捷方式访问这些可点击的东西,并将其放入我的脚本或其他丑陋的方式。

您必须手动执行此操作:

单击那个小箭头,右键单击图标,然后左键单击名称。

有什么方法可以自动执行此操作吗?这让我发疯。

希望有人能帮助我,将不胜感激。

PS:我坐在一台权限受限的机器上,所以我可能无法使用 Windows API-ish 解决方案来解决这个问题。

编辑评论:

不可能:

来自帮助。

激活一个应用程序window。

object.AppActivate title 

object WshShell object.

标题 指定要激活的应用程序。这可以是包含应用程序标题(显示在标题栏中)或应用程序进程 ID 的字符串。

我不知道您对有关 window 的信息有什么访问权限。一些 COM object 有一个 HWnd 属性。此 post 向您介绍如何将 hwnd 转换为上面要使用的 ProcessID。

How to find the window Title of Active(foreground) window using Window Script Host

这显示了如何将进程 command-line 转换为 ProcessID。要查看可用的属性和方法,请使用 command-line 工具 wmic(wmic process get /?wmic process call /?

Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\.\root\cimv2")

Set colItems = objWMIService.ExecQuery("Select * From Win32_Process")

For Each objItem in colItems
    msgbox objItem.ProcessID & " " & objItem.CommandLine
Next

我找到了...

resizeWorkingPane 方法 - 用于更改 window 的大小 - 在后台也适用于 windows。如果更改参数,window 将出现在前台。

session.findById("wnd[0]").resizeWorkingPane 300,200,false

我必须部分撤销它,因为它不适用于所有 windows。我仍然不确定为什么,但它有时会不断失败。不过,在我看来,这是最接近的。

同样,它也适用于以下命令:

session.findById("wnd[0]").iconify
session.findById("wnd[0]").maximize

这是 100% 的时间解决方案。这很丑陋,但它有效。您可以将 IQS3 t 代码换成您可以确认用户不会进入并且可以访问的任何其他代码。我选择此代码的部分原因是它加载速度快。

Set objShell = CreateObject("wscript.shell")
session.findById("wnd[0]/tbar[0]/okcd").text = "/nIQS3"
session.findById("wnd[0]").sendVKey 0
objShell.AppActivate(cstr(session.ActiveWindow.Text))
session.findById("wnd[0]/tbar[0]/btn[3]").press