どこから始めればいいのかわからないので、何百ものことを試し、何時間もグーグルで検索しましたが、何も役に立たなかったのです。 (私はあらゆる汚いトリックを受け入れます。)
これが私の問題です:
次のようなリストボックスを持つ.htaファイルがあります。
実行中のSAPGuiのすべてのセッション/モディが一覧表示されます。
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
私の目標:そのリストのエントリの1つをダブルクリックすると、SAP Guiの選択したインスタンスが前面に表示され、アクティブ化されます。
残念ながら、私のタスクマネージャーは1つのタスクしかリストしておらず、それが「SAPログオン」です。開いたウィンドウの1つにも「SAPLogon」という名前があり、他のすべてのウィンドウには「SAPEasyAccess」という同じ名前が付いています。
接続のID(サーバー名)とセッションのIDを確認する唯一の方法は、vbscriptでそれらを抽出することです。 (上記を参照)
それを行う方法はありますか?千の解決策を試した後に私が考えることができる唯一の回避策は、次の2つです。
非常に醜い回避策:
If sessionID = sess.ID Then
Set objShell = CreateObject("Shell.application")
objShell.MinimizeAll
sess.findById("wnd[0]").maximize
End If
すべてのウィンドウを最小化してから、選択したSAPウィンドウを最大化します。残念ながら、私のHTA-GUIも最小化されており、これはちょっと残念です。
2番目のアイデア:
どういうわけか、ショートカットでこれらのクリック可能なものに到達し、それを私のスクリプトまたは他の醜い方法に入れてください。
手作業でこれを行う必要があります:
その小さな矢印をクリックし、アイコンを右クリックしてから、名前を左クリックします。
これを自動化する方法はありますか?それは私を夢中にさせています。
誰かが私を助けてくれることを願っています、それは大いにありがたいです。
PS:私は制限された権限を持つマシンに座っているので、WindowsAPI風のソリューションではこれに取り組むことができないかもしれません。
コメントに関する編集:
それは不可能:
見つけた...
ウィンドウのサイズを変更するためのresizeWorkingPane
メソッドは、バックグラウンドのウィンドウでも機能します。パラメータを変更すると、ウィンドウが前面に表示されます。
session.findById("wnd[0]").resizeWorkingPane 300,200,false
すべてのウィンドウで機能するとは限らないため、これを部分的に取り消す必要があります。理由はまだわかりませんが、失敗し続けることがあります。それでも、これがあなたが得ることができる最も近いように私には思えます。
ヘルプから。
アプリケーションウィンドウをアクティブにします。
object.AppActivate title
objectWshShellオブジェクト。
titleアクティブ化するアプリケーションを指定します。これは、アプリケーションのタイトル(タイトルバーに表示される)またはアプリケーションのプロセスIDを含む文字列にすることができます。
ウィンドウに関する情報にどのようにアクセスできるかわかりません。一部のCOMオブジェクトにはHWndプロパティがあります。この投稿では、hwndを上記で使用するProcessIDに変換する方法を説明します。
ウィンドウスクリプトホストを使用してアクティブ(フォアグラウンド)ウィンドウのウィンドウタイトルを見つける方法
これは、プロセスのコマンドラインを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
同様に、次のコマンドでも機能します。
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