2021年8月7日土曜日

VBSでIEを最前面に出す

 VBAだと

    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Visible = True

で最前面に表示されるのですけど、VBSだとなぜか背面に表示されます。

APIの「SetForegroundWindow」が使えそうなのですが、VBSで使える?

trickyではありますが、Excel4.0からcallすると使えるようです。

    'windowactiveにする(APIを使う)
    With CreateObject("Excel.Application")
        Call .ExecuteExcel4Macro("CALL(""user32"", ""SetForegroundWindow"", ""JJ"", " & objIE.hWnd & ")")
    End With

    戻り値はtrue/falseのようですけど、”JJ”を”LJ”にするとerrorになります。

    変数=戻り値、にしてもerrorになる?

ですが、windowが前面に出てきません。

調べていくと「SetForegroundWindowWindows95、およびWindows98では正常に機能しますが、Windows2000WindowsXPにおいてはタスクバーで点滅し、ウィンドウが隠れてしまいます。」とな。orz

では、「SetWindowPos」ではどうでしょう。

    'windowactiveにする(APIを使う)
    With CreateObject("Excel.Application")
        Call .ExecuteExcel4Macro("
CALL(""user32"",""SetWindowPos"",""JJJJJJJJ""," & objIE.hWnd & ",0,0,0,0,0,3)")
    End With

hWndの直後の0は「Zオーダーのトップに置く」らしいのですが、うまくいきません。
-1が「ウィンドウ表示リストのトップに置く(非アクティブになっても常にトップ位置を保持する)」であり、これはうまくいきました。しかし常にtopに居座られるのは邪魔。
-2は「トップ指定されたウィンドウの直後に置く」となってますが「解除」となっているものもあり、これを噛ませるたら所望の動作にできました。

よって、最終的なcodeは以下になります。

    'windowactiveにする(APIを使う)
    With CreateObject("Excel.Application")
        Call .ExecuteExcel4Macro("
CALL(""user32"",""SetWindowPos"",""JJJJJJJJ""," & objIE.hWnd & ",-1,0,0,0,0,3)")
        Call .ExecuteExcel4Macro("CALL(""user32"",""SetWindowPos"",""JJJJJJJJ""," & objIE.hWnd & ",-2,0,0,0,0,3)")
    End With

Excel.Application objectの生成に時間が掛かるのが玉に瑕ではありますが。
あ~、ExcelがinstallされていないPCではダメだという問題もありますね。

0 件のコメント:

コメントを投稿