web-dev-qa-db-ja.com

vbscriptを使用して特定のウィンドウをアクティブ化(フォアグラウンドにする)する

どこから始めればいいのかわからないので、何百ものことを試し、何時間もグーグルで検索しましたが、何も役に立たなかったのです。 (私はあらゆる汚いトリックを受け入れます。)

これが私の問題です:

次のようなリストボックスを持つ.htaファイルがあります。

hta file

実行中の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」という同じ名前が付いています。

enter image description here

接続の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番目のアイデア:

どういうわけか、ショートカットでこれらのクリック可能なものに到達し、それを私のスクリプトまたは他の醜い方法に入れてください。

手作業でこれを行う必要があります:

その小さな矢印をクリックし、アイコンを右クリックしてから、名前を左クリックします。

info tray symbols

これを自動化する方法はありますか?それは私を夢中にさせています。

誰かが私を助けてくれることを願っています、それは大いにありがたいです。

PS:私は制限された権限を持つマシンに座っているので、WindowsAPI風のソリューションではこれに取り組むことができないかもしれません。

コメントに関する編集:

それは不可能:

  • レジストリエントリを変更するには
  • cOMオブジェクトを作成する
  • vBScript以外のもので動作する
6
Tom K.

見つけた...

ウィンドウのサイズを変更するためのresizeWorkingPaneメソッドは、バックグラウンドのウィンドウでも機能します。パラメータを変更すると、ウィンドウが前面に表示されます。

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

すべてのウィンドウで機能するとは限らないため、これを部分的に取り消す必要があります。理由はまだわかりませんが、失敗し続けることがあります。それでも、これがあなたが得ることができる最も近いように私には思えます。

1
Tom K.

ヘルプから。

アプリケーションウィンドウをアクティブにします。

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
2
user5721973

同様に、次のコマンドでも機能します。

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

これは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
0
ABrunette