見出し画像

「クリックしたい」という問題についての解決案【UWSC】

「〇〇をクリックしたいのにできない」という問題

よくある問題だと思うんですよね。「こんな感じでいいんじゃないかな」と寄せ集めのコードをコピペして修正、パイロット版を作ってから実際にテストしてみると「〇〇をクリックしたいのにできない」、「〇〇をクリックしたはずなのに期待通りの動作をしない」などはよくある問題ですよね。

原因にも色々あるし解決策も色々ある

よくある問題ではあるんですが、原因にも色々あるし解決策も色々あるというところが問題を難しそうにしていると思うんですよね。でも基本的には原因は何かを把握して、解決策を用意すれば解決できます。
この記事では、対象の環境を特定せず「〇〇をクリックしたいのにできない」という問題についての解決案を考えていきたいと思います。

段階を分けて考えてみましょう

色々な考え方があると思うのですが、この記事では段階を3つに分けて考えたいと思います。

  1. 準備段階

  2. 実際のクリック処理

  3. 後処理

ですね。

準備段階

この段階では、いつ、どこで、何が、何に、どのような状態、どのような方法で、どのくらい、どうするのか…ということを把握しようとします。

  • いつ:「実際のクリック処理」を実行するタイミングに

  • どこで:どの画面上のどの位置で

  • 何が:マウスポインタ、カーソル、入力エリア など

  • 何を:「ボタン」の名称、リンク、所定の座標 など

  • どのような状態:「ボタン」上にあり、図案が反転した状態で など

  • どのような方法で:左クリック、ショートカットキー、キーを送信 など

  • どのくらい:1/1000秒単位、1/100秒単位、1/10秒単位 など

  • どうするのか:ダウンとアップ、クリック、キーを送信 など

例えば、「実際のクリック処理」を実行するタイミングにまだ、どの画面のどの位置をクリックすればよいのか、がわかってないとしたらどうでしょうか?
その状態から期待した動作をさせようとするのは、簡単ではないということが想像できると思います。では期待した動作をさせたいと思うのであれば、準備段階で必要な条件を特定して、準備しておく必要があります。

実際のクリック処理

実際のクリック処理は、現実的に動作するコードであるかを検証してみる必要があります。「システム画面への入力とExcel へのデータ取得のサンプル【UWSC】」という記事を書いているのですが、そのサンプルコードの中にいくつかのボタン押す処理があります。

clkitem(id,"クリア",CLK_ACC) 	//クリアのボタンを押す	//使えます
clkitem(id,"プラス",CLK_BTN)		//プラスのボタンを押す	//使えます
clkitem(id,"等号",CLK_BTN)		//イコールのボタンを押す	//使えます

これらが、そうなのですが実際に「電卓」アプリを表示して確認いただけませんか?
「C:クリア」、「+:プラス」、「=:等号」のようにアプリ上の表記と現実的に動作するコードの表記が異なっていることが理解できると思います。これについては、「2.画面を分析できるようにする【UWSC】」という記事を書いているのですが、画面を分析する手法を用いて情報を取得しています。

clkitem(id,"C",CLK_ACC) 	//クリアのボタンを押す	//使えません
clkitem(id,"+",CLK_BTN)	//プラスのボタンを押す	//使えません
clkitem(id,"=",CLK_BTN)	//イコールのボタンを押す	//使えません

想像で上記のようにすれば現実的に動作するコードのようにも思えてしまいますが、現実的に動作しません。現実的に動作するコードであることを実証されていないコードに対し、いくら「準備段階」や「後処理」を念入りに準備しても無駄になりますので、現実的に動作するコードであるかの検証はしっかり行いましょう。

後処理

後処理は常に必要というわけではないのですが、後処理が必要かどうかの検討は、常に行った方がよいと考えられます。というのも開発中、テスト中であれば、動作を確認しながら画面の増減や色や形の変化、ボタンの増減や色や形の変化、入力エリアの増減や色や形の変化など、その場で確認すればそれほど手間は増えませんが、しばらくしてから条件を整えて再度確認が必要となれば、それなりに工数が掛かります。後処理が必要かどうかの検討は、常にその場で終えてしまうことをお勧めします。
例えば、ボタンをクリック後に常に別画面がポップアップするが、別画面の「OK」ボタンをクリックするだけだったとします。このようなケースでは、別画面の「OK」ボタンをクリックし、元の画面IDをアクティブ戻すところまでを後処理と考えれば、「画面IDが別画面のIDになったままだったのを忘れてた」というようなミスの予防にもなると思います。

総合的に判断する

段階を3つに分けて説明しましたが、順番に処理していくのではありません。「準備段階」、「実際のクリック処理」、「後処理」があることを念頭に置いて総合的に判断していきます。というのも「実際のクリック処理」が「電卓」アプリの例のように

clkitem(id,"クリア",CLK_ACC) 	//クリアのボタンを押す	//使えます

CLKITEM関数のアイテム名称を指定する方法で現実的に動作することが確認できた場合、少なくとも「準備段階」で「どこで:どの画面上のどの位置で」という位置の情報は不要、その他にも不要になる項目が多く、関心事が絞り込まれることがわかります。

CLKITEM関数が有効な例

 // アクティブにする、なければ起動する
if GETID("電卓","ApplicationFrameWindow", 0.1) < 0 then EXEC("calc")
id=GETID("電卓","ApplicationFrameWindow",-1)	//IDを取得できるまで待つ

REPEAT
SLEEP(0.02)
CTRLWIN(id, ACTIVATE) // IDの画面をアクティブにする
UNTIL STATUS(id, ST_ACTIVE) // IDの画面がアクティブなるまで待機

clkitem(id,"クリア",CLK_ACC) //初期化	//クリアのボタンを押す

再び「システム画面への入力とExcel へのデータ取得のサンプル【UWSC】」という記事からサンプルとなる部分を抜き出してみました。
※適当に数値を入力してからテストしてください。
「どこで:どの画面上の(どの位置で)」
「いつ:電卓アプリがアクティブなってるとき」
「どのような方法で:CLKITEM関数でアイテム名を指定して」
「〇〇をクリックしたい」を実現しているわけですね。

SCKEY関数が有効な例

 // アクティブにする、なければ起動する
if GETID("電卓","ApplicationFrameWindow", 0.1) < 0 then EXEC("calc")
id=GETID("電卓","ApplicationFrameWindow",-1)	//IDを取得できるまで待つ

REPEAT
SLEEP(0.02)
CTRLWIN(id, ACTIVATE) // IDの画面をアクティブにする
UNTIL STATUS(id, ST_ACTIVE) // IDの画面がアクティブなるまで待機

SCKEY(ID,VK_DELETE) //初期化	//クリアのボタンを押す

SCKEY関数が有効な場合の例として、仮想キーコードを送信するパターンです。
※適当に数値を入力してからテストしてください。
このケースではクリックしたいアイテムの名称が不要になりますが、クリックしたい仮想キーコードの情報が必要になりますね。

CLKITEM関数が無効な例

 // アクティブにする、なければ起動する
if GETID("電卓","ApplicationFrameWindow", 0.1) < 0 then EXEC("calc")
id=GETID("電卓","ApplicationFrameWindow",-1)	//IDを取得できるまで待つ

REPEAT
SLEEP(0.02)
CTRLWIN(id, ACTIVATE) // IDの画面をアクティブにする
UNTIL STATUS(id, ST_ACTIVE) // IDの画面がアクティブなるまで待機

//初期化	//クリアのボタンを押す
BTN(LEFT,CLICK,250+STATUS(ID,ST_X),300+STATUS(ID,ST_Y),40) 

仮にですが、CLKITEM関数が無効(有効ではなかった)場合の例として、座標を指定して左クリックをするパターンです。
※適当に数値を入力してからテストしてください。
このケースではクリックしたいアイテムの名称が不要になりますが、クリックしたい位置の情報が必要になりますね。

ダブルクリックがしたい例

 // アクティブにする、なければ起動する
if GETID("電卓","ApplicationFrameWindow", 0.1) < 0 then EXEC("calc")
id=GETID("電卓","ApplicationFrameWindow",-1)	//IDを取得できるまで待つ

REPEAT
SLEEP(0.02)
CTRLWIN(id, ACTIVATE) // IDの画面をアクティブにする
UNTIL STATUS(id, ST_ACTIVE) // IDの画面がアクティブなるまで待機

FOR i = 1 TO 2	//この場合は2回クリック
BTN(LEFT,CLICK,365+STATUS(ID,ST_X),170+STATUS(ID,ST_Y),40) 
NEXT

仮にですが、画面上の特定の位置をダブルクリックしたい場合の例として、座標を指定して複数回左クリックするパターンです。
※適当に数値を入力してからテストしてください。
このケースではクリックしたい位置の情報が必要になりますね。

注意してたいただきたい例

準備段階が整っていないケースがあります。画面がまだアクティブになってなかったり、ボタンや入力エリアなどがまだ有効になっていなかったりすることで、現実的に動作するコードを確認 できていても動作しない状態になったりします。また、マウスポインタが特定の範囲にないとダメ、入力エリアや背景の色が変化しないとダメ、前処理の保存が完了しないとダメ、ステータスバーの表示を確認してからでないとダメ など、思いもしなかった原因やその組み合わせで期待した動作をしてくれないことがあります。
その際、同じことを何度試しても上手くいきませんので、様々な可能性を色々試して原因を特定できるようにしてください。

「〇〇をクリックしたいのにできない」という問題についての解決案について書いてみました。この記事が皆さんのお役に立てば幸いです。

有料エリアには何も情報がありません
記事を評価してくれた方はサポートもお願いします

誰もが無料でWindows自動化を始め、生産性を向上し続けられるようにする」

ここから先は

15字

¥ 100

この記事が気に入ったらサポートをしてみませんか?