knowledge オブジェクト/ボタンなどの状態判定:ピクセルの色で判断

本記事では、オブジェクトやボタンなどの状態をピクセルの色を基準にして判断する方法を紹介します。
(なお、本記事の内容では座標位置を使用します。)

例として、以下のような状況を想定します。
[図1]

[図2]

[図1]は「適用」ボタンがグレーアウトしていて押せない状態、[図2]は「適用」ボタンがアクティブになっていて押すことのできる状態になっています。
ところが、両者ともに「対話機能」アクションで取得すると、プロパティ値が同じになります。

<AMINTERACT ACTIVITY="mouse_to_object" WINDOWTITLE="印刷" ACCESSIBILITYENGINE="active" OBJECTPROPERTIES="Toolkit=WindowsAccessibility,Type=PushButton,Class=Button,Name=適用(A),Value=,X=,Y=" />

つまり、ボタンが押せる状況でも押せない状況でも「対話機能」アクションが通るため、想定した通りの操作が出来ておらずボタンがグレーアウト(非活動状態)になっていると、対話機能アクションが空振りし後のステップで副次的にエラーになる可能性があります。

その際に1つの手段として使えるのが、「ピクセルの色で判定する」方法となります。
AutoMateでは、指定された座標のピクセルが何色であるかを判断することが出来ます。
今回は、「IF - ピクセルの色」アクションを使用して上記の判断を行います。
なお、ピクセルの色は、完全一致でなくてはなりません。例えば人間から見てほぼ同じ赤色でも、カラーコードが少しでも違うと条件に一致しません。
そのため、以下[図3]のようにマウスが該当のボタンに合わさっていると色が変化する場合などは、色が変化した後のピクセル色で判断するようにするか、事前にマウスを別の場所に移動する等して回避してください。
[図3:ボタンがアクティブかつマウスが該当ボタンに合わさっている場合]

なお、ある程度大きいボタンや単色のボタンであればこちらの方法で条件判断が可能ですが、グラデーションが設定されていて同一ボタン内でも座標によって色が少しずつ変化しているオブジェクトや、面積が著しく小さいオブジェクトに対しては適さない場合が多いのでご留意ください。
ピクセル色取得の方法は、「入力」アクションのマウス移動時と同様に、「Insert」キーを押すと現在マウスのある座標とピクセルが取得されます。

以下、一例です。
メモ帳を開いて「印刷」ダイアログを出し、ボタンの非活動状態・活動状態をそれぞれ取得するサンプルになっています。

<!--メモ帳を開く-->
<AMRUN FILE="notepad" />
<AMWAIT ACTIVITY="window" WINDOWTITLE="*無題 - メモ帳*" FOCUSWINDOW="YES" />
<!--印刷ダイアログを出す-->
<AMINPUT KEYSTROKES="{CTRL}p" />
<AMWAIT ACTIVITY="window" WINDOWTITLE="印刷" FOCUSWINDOW="YES" />
<AMWINDOW WINDOWTITLE="印刷" />
<AMINTERACT ACTIVITY="mouse_to_object" WINDOWTITLE="印刷" ACCESSIBILITYENGINE="active" OBJECTPROPERTIES="Toolkit=WindowsAccessibility,Type=PushButton,Class=Button,Name=適用(A),Value=,X=,Y=" />
<AMIF ACTIVITY="pixel_exists" XPOS="469" YPOS="464" COLOR="13421772" />
<AMSHOWDIALOG MESSAGE="ボタンはグレーアウトしています" COUNTDOWNDELAY="5" />
<AMIF ACTIVITY="end" />
<!--値を変更して「適用」ボタンをアクティブ化させる-->
<AMINTERACT ACTIVITY="set_text" WINDOWTITLE="印刷" ACCESSIBILITYENGINE="active" OBJECTPROPERTIES="Toolkit=WindowsAccessibility,Type=SelectableText,Class=Edit,Name=部数(C):,Value=,X=,Y=" TEXT="2" />
<AMINTERACT ACTIVITY="set_text" WINDOWTITLE="印刷" ACCESSIBILITYENGINE="active" OBJECTPROPERTIES="Toolkit=WindowsAccessibility,Type=SelectableText,Class=Edit,Name=部数(C):,Value=,X=,Y=" TEXT="1" />
<!--マウスオーバーしていると色が変化することに対する回避 ある程度間をおかないと色判定までに色が変化しない-->
<AMINPUT ACTIVITY="move_mouse" X="1" Y="1" DELAY="1000" />
<AMIF ACTIVITY="pixel_exists" XPOS="469" YPOS="464" COLOR="14803425" />
<AMSHOWDIALOG MESSAGE="ボタンはアクティブです" COUNTDOWNDELAY="5" />
<AMIF ACTIVITY="end" />
<AMINTERACT ACTIVITY="mouse_to_object" WINDOWTITLE="印刷" ACCESSIBILITYENGINE="active" OBJECTPROPERTIES="Toolkit=WindowsAccessibility,Type=PushButton,Class=Button,Name=適用(A),Value=,X=,Y=" />
<AMINPUT ACTIVITY="click_mouse" />