我甚至不知道从哪里开始我的问题,我尝试了几百个东西并用Google搜索了几个小时但没有找到任何有用的东西。 (我对每一个肮脏的伎俩都开放。)
这是我的问题:
我有一个带有列表框的.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实例应该到达前台/被激活。
不幸的是,我的taskmanager只列出了一个任务,那就是&#34; SAP Logon&#34;。我打开的一个窗口也有名称&#34; SAP Logon&#34;,所有其他窗口都有相同的名称:&#34; SAP Easy Access&#34;。
我能看到连接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解决方案解决这个问题。关于评论的编辑:
不可能:
答案 0 :(得分:2)
来自帮助。
激活应用程序窗口。
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
答案 1 :(得分:2)
同样,它也适用于以下命令:
session.findById("wnd[0]").iconify
session.findById("wnd[0]").maximize
答案 2 :(得分:1)
我发现了......
resizeWorkingPane
方法 - 用于更改窗口大小 - 也适用于后台窗口。如果更改参数,窗口将显示在前台。
session.findById("wnd[0]").resizeWorkingPane 300,200,false
我必须部分撤销这个,因为它不适用于所有窗口。我还不确定为什么,但它有时会一直失败。不过,在我看来,这是你能得到的最接近的。
答案 3 :(得分:0)
这是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