【问题标题】:Activating (bring to foreground) a specific window with vbscript使用 vbscript 激活(带到前台)特定窗口
【发布时间】:2016-02-04 15:54:56
【问题描述】:

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

这是我的问题:

我有一个带有如下列表框的 .hta 文件:

它列出了我正在运行的 SAP Gui 的所有会话/模式。

        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 的选定实例应该会出现在前台/被激活。

不幸的是,我的任务管理器只列出了一项任务,那就是“SAP 登录”。我打开的一个窗口也具有名称“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

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

第二个想法:

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

您必须手动操作:

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

有什么办法可以自动完成吗?快把我逼疯了。

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

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

关于 cmets 的编辑:

这是不可能的:

  • 更改注册表项
  • 创建 COM 对象
  • 使用 VBScript 以外的任何东西

【问题讨论】:

  • 究竟是什么原因,为什么这个问题被否决了? O.o
  • 可能是因为您还没有接受their answer,我个人认为这个问题没有任何问题。我见过更糟糕的情况。
  • 我为什么要接受这些……无论如何。如果您看到的情况更糟,那么您可能看到的情况要好得多。 ;) 我可以进行哪些更改以使其更易于理解?
  • 你错过了理解我我的意思是这个问题没有任何问题(就值得一票否决而言)
  • 是的,我明白了。 ;) 只是我坐在那个推 F5 的帖子前面(比喻)。所以我有足够的时间让这篇文章更清楚。

标签: windows vbscript sap


【解决方案1】:

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

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

【讨论】:

  • 我今天再次测试了这个,大部分时间都有效。谢谢!不知道为什么它有时不起作用。
【解决方案2】:

我找到了...

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

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

我必须部分撤销它,因为它不适用于所有窗口。我仍然不知道为什么,但有时它总是失败。不过,在我看来,这是你能得到的最接近的。

【讨论】:

    【解决方案3】:

    来自帮助。

    激活应用程序窗口。

    object.AppActivate title 
    

    对象 WshShell 对象。

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

    我不知道您对窗口的信息有什么访问权限。某些 COM 对象具有 HWnd 属性。这篇文章将告诉您如何将 hwnd 转换为要在上面使用的 ProcessID。

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

    这显示了如何将进程命令行转换为 ProcessID。要查看可用的属性和方法,请使用命令行工具 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
    

    【讨论】:

    • 不幸的是,我仍然只得到一个带有以下参数的进程:“ProcessID:3208 //名称:saplogon.exe //命令行:“C:\ Program Files(x86)\ SAP \ FrontEnd \ SAPgui\saplogon.exe”。所以仍然无法找到“AppActivate”的正确窗口。:/
    • 进程对象有一个sessionid。
    • 也许我没有做对,但如果只有一个进程(这是我到目前为止使用您的代码得到的),我只会得到一个 SessionID(即“1”)。
    【解决方案4】:

    这是 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
    

    【讨论】:

    • 很快就会试试这个。谢谢你把这个弄死。 ;)
    猜你喜欢
    • 2021-08-06
    • 2018-04-19
    • 2015-02-01
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多