VBScriptでWindowsAPIを使用する方法

スポンサーリンク

VBScriptのすぐに起動できるメリットを生かす

最近RPA(Robotic Procee Automation)で業務効率化に取り組んでいますが、ある種類のアプリの中でウインドウを閉じる挙動がうまくいかず、開いているウインドウを閉じる方法を考えていました。

RPAだけを使っての解決方法は知識が足りず実現できず、とりあえず納期までにロボットを完成させないといけなかったのでWindowsAPIを使用してウインドウを閉じるツールを作り、それをRPAで起動して対処するという逃げ技を用いることにしました。

WindowsAPIはExcelVBAやAccessVBAで実行しても良かったのですが、できればファイルを開いたときにコンテンツの有効化などもクリックする必要なく、すぐに実行できる方法が良かったので、VBScriptでコードを書いてみました。

今回はアプリのWindowsAPIを用いてウインドウを閉じるVBScriptで操作する方法をVBAでの記載方法と比較しながら紹介します。

ウインドウを閉じるのに用いるWindows API関数は2つ

開いているウインドウを閉じるのに直接用いるWindows API関数は下記2種類です。

①FindWindowA

開いているウインドウのウインドウハンドルを取得するのに用います。

②PostMessage

ハンドルを取得したウインドウに対して閉じるコードを送信します。

またその他にクラス名を調べるにはIsWindowVisible・GetClassName・GetNextWindowのWindows API関数を使用しています。

ウインドウのクラス名を取得する方法はこちらのページをご確認ください。

スポンサーリンク

ウインドウを閉じるWindowsAPIを用いたVBAコードとVBScript

今回はAdobeReaderで開いたPDFファイルのウインドウを閉じるVBAコードとVBScriptをご紹介します。
事前にAdobeReaderのクラス名が「AcrobatSDIWindow」であることを確認してからコードを作成しています。

  • VBAコード
  • ’ウインドウハンドルを取得する
    Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

    ’メッセージの送信
    Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

    Public Const WM_CLOSE = &H10

    Sub PDFアプリのウインドウ閉じる()

    Dim hWnd As Long
    hWnd = FindWindow("AcrobatSDIWindow", vbNullString)
    PostMessage hWnd, WM_CLOSE, 0, 0

    End Sub

  • VBScript
  • Dim hWnd
    Dim Excel
    Set Excel = WScript.CreateObject("Excel.Application")

    hWnd = Excel.ExecuteExcel4Macro("CALL(""user32"", ""FindWindowA"", ""JCJ"", ""AcrobatSDIWindow"", 0 )")

    If hWnd = 0 Then WScript.Quit
    Call Excel.ExecuteExcel4Macro("CALL(""user32"", ""PostMessageA"", ""JJJJJ"", " & hWnd & ", 16, 0, 0)")

    Set Excel = Nothing

    上記のコードをテキストエディタなどにコピペして、ファイルの拡張子を「.vbs」にすればファイルの完成です。
    ダブルクリックなどで起動すると開いているPDFのファイルが1つ閉じます。

    VBScriptでのWindowsAPI活用のポイント

    VBScriptでのWindowsAPI活用のポイントは下記2点です。

    ①WindowsAPIを呼び出すのにExcelVBAを使う(もしくは他のVBAでもOKらしい(?))

    WindowsAPIをVBscriptで直接使用するのはハードルが高いようで、方法がわかりませんでした。
    調べたところVBAを中継して起動する方法が手軽そうだったのでExcelを介して使ってみました。

    AccessやWordでもできるようですが、私が調べた限り方法がわかりませんでした。
    またわかればご紹介します。

    ②WindowsAPI関数は「Excel.ExecuteExcel4Macro(“CALL(~)”)」で実行する

    Excelを中継してVBScript内でWindowsAPI関数を使用する際はVBAで通常WindowsAPIを使用する場合と書き方が異なるようです。
    書式としてはExcel.ExecuteExcel4Macro(“CALL(~)”)でAPI関数を指定します。

    Call関数の引数は「ライブラリ名」・「API関数名」・「API関数の返り値の型とAPI関数の引数の型をアルファベット1文字で表記したもの」・「API関数で使用する引数(複数の場合「,」で区切る)」の順で記載します。

    3つ目の「API関数の返り値の型とAPI関数の引数の型をアルファベット1文字で表記したもの」はlongの値渡しの場合「J」、末尾がNullの文字列の値渡しは「C」となるようです。

    関数自体の返り値を1文字目にして、2文字目以降はAPI関数の引数の型となりますが、複雑でわかりにくいので細かいこと考えず、どこかのネットのサンプル丸写しでもいい気がします。

    コメント