Kompira

Menu Menu

Enterprise Technical information

外部との連携 KompiraからWindowsGUIアプリケーションを操作する (1/2)

運用の中で既に利用されているアプリケーションを自動化することができれば、運用効率の向上が期待できます。しかし、そのアプリケーションのインターフェースがGUIしか存在しない場合、それを自動化することは容易ではありません。

そこで本稿では、「KompiraからWindowsGUIアプリケーションを操作する」方法(全2回)を紹介します。
初回である今回は、Windowsアプリケーション操作ライブラリFriendlyを用いて、Windowsの代表的なアプリケーションの「メモ帳」を操作します。
2回目は、KompiraからWindowsに接続し、メモ帳を操作する方法を紹介します。

図: 全体像


動作確認環境

ソフトウェア バージョン
Kompira 1.4.10.post10
LinuxOS CentOS6.10

または

ソフトウェア バージョン
Kompira 1.5.5.post7
LinuxOS CentOS7.8.2003

 


 

Windowsアプリケーションの自動操作

Windowsアプリケーションを自動操作する方法には、以下の2種類の方法が考えられます。

・マウスやキーボードをエミュレートする
・ボタンやテキストボックスなどUI要素にアクセスし操作する

ここでは、 時刻や内部データに応じて、UIの表示量や表示順が変わる場合でも、確実に操作できる「UI要素にアクセスし操作する」方法を取り上げます。

 

Friendly

Friendlyとは、Codeer社が開発したWindowsアプリケーション操作用ライブラリです。Friendlyを使用することで、対象アプリケーションに別のプロセスからアタッチし、操作することができます。

 

Friendlyによるメモ帳の操作

以下は、「メモ帳」の編集欄に任意の文字列を入力するコンソールアプリケーションのコードです。
このアプリケーションを実行すると、メモ帳を触ることなく、メモ帳に”buz”という文字列を表示することができます。

 

using System;
using System.Diagnostics;

// Fiendlyライブラリの読み込み
using Codeer.Friendly;
using Codeer.Friendly.Dynamic;
using Codeer.Friendly.Windows;
using Codeer.Friendly.Windows.Grasp;
using Codeer.Friendly.Windows.NativeStandardControls;
using Ong.Friendly.FormsStandardControls;

namespace kompira
{
    class Program
    {

        static int
        Main(string[] args)
        {
            int processid = int.Parse(args[0]);

            // プロセスへアタッチ及び構成要素へのアクセッサ取得
            Process process = Process.GetProcessById(processid);
            WindowsAppFriend app_notepad = new WindowsAppFriend(process);
            WindowControl main_window = WindowControl.FromZTop(app_notepad);
            NativeEdit txt_edit = new NativeEdit(main_window.IdentifyFromDialogId(15));

            // 編集欄への書き込み
            string test_txt = "buz";
            txt_edit.EmulateChangeText(test_txt);

            return 0;
        }
    }
}

 

Friendlyライブラリの読み込み

Friendlyのライブラリを読み込みます。

 

using Codeer.Friendly;
using Codeer.Friendly.Dynamic;
using Codeer.Friendly.Windows;
using Codeer.Friendly.Windows.Grasp;
using Codeer.Friendly.Windows.NativeStandardControls;
using Ong.Friendly.FormsStandardControls;

 

Friendlyはnugetに登録されているので、プロジェクト設定ファイル.csprojに以下の設定を追加することで、使用することができます (※)。

 

<Project Sdk="Microsoft.NET.Sdk">
    <!-- 省略 -->

    <ItemGroup>
        <PackageReference Include="Codeer.Friendly" Version="2.5.2"/>
        <PackageReference Include="Codeer.Friendly.Windows" Version="2.9.0"/>
        <PackageReference Include="Codeer.Friendly.Windows.Grasp" Version="2.7.1"/>
        <PackageReference Include="Codeer.Friendly.Windows.NativeStandardControls" Version="2.6.0"/>
        <PackageReference Include="Ong.Friendly.FormsStandardControls" Version="2.6.1"/>
    </ItemGroup>

    <!-- 省略 -->
</Project>

 

※ または、以下のように開発環境上で以下のコマンドを実行すると、.csprojに自動的に上記が追加することができます。

 

> dotnet add package Codeer.Friendly.Windows.Grasp --version 2.7.1

 

プロセスへアタッチ及び構成要素へのアクセッサ取得

プロセスIDを指定し、メモ帳のプロセスへアタッチします。
メモ帳は、下図のように、「編集欄」と「ステータスバー」から構成されます。

 

図: メモ帳の構成

 

編集欄のIDを指定し、アクセッサ(text_edit)を取得します。

 

Process process = Process.GetProcessById(processid);
WindowsAppFriend app_notepad = new WindowsAppFriend(process);
WindowControl main_win = WindowControl.FromZTop(app_notepad);
NativeEdit txt_edit = new NativeEdit(main_win.IdentifyFromDialogId(15));

 

構成要素のIDを取得するためには、別途、アプリケーションの解析が必要となります。
アプリケーションの解析方法については、後ほど説明します。

 

編集欄への書き込み
取得したアクセッサを使い、文字列を編集欄へ書き込みます。

 

string test_txt = "buz";
txt_edit.EmulateChangeText(test_txt);

 

アプリケーションの解析

構成要素を指定・操作するためには、対象となる要素のIDを知っておく必要があります。IDは、専用のツールを用いてアプリケーションを解析することで得ることができます。

 

TestAssistant
TestAssistantはCooder社が提供するGUI解析用ツールです。以下からダウンロードすることで使用することができます。

https://www.codeer.co.jp/CodeAndTool

 

TestAssistantによるメモ帳の解析

それでは、TestAssistantを使って、メモ帳を解析してみましょう。

1. メモ帳を起動します
2. TestAssistantを起動します
3. メモ帳にアタッチします

テスト対象プロセス選択ボタンを押して、対象アプリケーション(=メモ帳)にアタッチします

 

 

4. 要素の解析を行います
4.1. トップレベルウインドウ解析ボタンを押下します

 

 

4.2. 中央ペインで、編集欄をクリックすると、右ペイン下の表に指定した要素の情報が記載されます

 

 

本稿では、DialogId=15を用いて、記入欄の要素にアクセスします(※)

※ 要素のIDには、複数の種類が存在します。アプリケーションによっては、同じIDを持つ構成要素が存在するため、状況に応じてIDを使い分けてください。

 

TestAssistantによる操作のキャプチャ

TestAssistantには、アプリケーションの操作をキャプチャする機能が存在します。この機能を用いることで、アプリケーション操作の実装が簡単になるため、覚えておいた方がよいでしょう。

1. メモ帳、TestAssistantを起動し、メモ帳にアタッチします
2. 「操作によるコード生成ボタン」を押下します

 

 

3. メモ帳の編集欄にフォーカスし、文字を入力します

 

 

4. 操作によるコード生成ウインドウに入力した文字列を入力する操作のコードが生成されます

 

 

5. OKボタンを押下すると、TestAssistantの左ペインに、以下のような「メモ帳の編集欄に文字列を追加する」操作のコードが追加されます。

 

// GuiMap
WindowControl notepad = WindowControl.FromZTop(app);
NativeEdit edit1 = new NativeEdit(notepad.IdentifyFromDialogId(15));

// Operation
edit1.EmulateChangeText(@"ああああ");

 

まとめ
本稿では、Friendlyを用いてメモ帳を操作する方法を紹介しました。この方法を応用することで様々なWindows GUIアプリケーションを自動的に操作することができます。

次回は、今回説明した方法を拡張し、Kompiraからメモ帳を操作する方法をご紹介いたします。

スタートガイド

Kompiraジョブフローの基礎

ジョブフローの簡単な例

Kompiraの機能

外部との連携