windows 使用vbscript激活(置于前台)特定窗口

dgtucam1  于 2023-06-24  发布在  Windows
关注(0)|答案(4)|浏览(436)

我甚至不知道从哪里开始我的问题,我尝试了一百种方法,在谷歌上搜索了几个小时,但没有发现任何有用的东西。(我对每一个肮脏的伎俩都持开放态度。
我的问题是
我有一个. hta文件,其中有一个列表框,看起来像这样:

它列出了我正在运行的SAP GUI的所有会话/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的选定示例应该会出现在前台/被激活。
不幸的是,我的任务管理器只列出了一个任务,那就是“SAP登录”。我打开的一个窗口也有名称“SAP登录”,所有其他窗口都有相同的名称:SAP Easy Access。

我可以看到连接ID(servername)和会话ID的唯一方法是通过使用vbscript提取它们。(见上文)
有什么办法吗?
在尝试了一千种解决方案后,我唯一能想到的解决方案是这两种:
非常丑陋的变通方法:

If sessionID = sess.ID Then
    
Set objShell = CreateObject("shell.application")
objShell.MinimizeAll
                        
sess.findById("wnd[0]").maximize

End If

它最小化所有窗口,然后最大化选定的SAP GUI窗口。不幸的是,我的HTA-GUI也被最小化了,这有点糟糕。
第二个想法:
以某种方式通过快捷方式获得这些可点击的东西,并将其放入我的脚本或其他丑陋的方式。
用手你必须这样做:
点击那个小箭头,右键点击图标,然后左键点击名字。

有没有什么方法可以让它自动化?我快疯了
希望有人能帮助我,这将是非常感激的。
PS:我坐在一台权限受限的机器上,所以我可能无法用Windows API解决方案解决这个问题。
编辑评论:
这是不可能的:

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

koaltpgm1#

类似地,它还可以使用以下命令:

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

kpbwa7wx2#

我找到了...
resizeWorkingPane方法-用于更改窗口的大小-也适用于背景中的窗口。如果更改参数,窗口将出现在前台。

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

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

5w9g7ksd

5w9g7ksd3#

从帮助。
激活应用程序窗口。

object.AppActivate title

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

我不知道你有什么渠道知道Windows的事。某些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
dsekswqp

dsekswqp4#

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

相关问题