アプリ版:「スタンプのみでお礼する」機能のリリースについて

プログラミングをかじったことのないわたしが、uwscをつい最近使い始めました。
さまざまなサイトから構文を引用して自分なりに組んでみたのですが、エラーこそでないですが思ったように回りません。
見当違いのことを書いているかもしれませんがどうぞよろしくお願いいたします。

やりたいことを軽く説明しますと、
・画像***.bmpを認識したら事前に組んだスクリプト□□□.uwsを読み込む
・画像〇〇〇.bmpを認識したらその画像をクリックする
・画像△△△.bmpを認識したらその画像をクリックする
・画像×××.bmpを認識したらその画像をクリックする

これらをいつでも認識して実行するマクロを組みたいです。

全くわからないなりに組んでみたのがこちらです。
修正とご指導のほどよろしくお願いします。

tmp=0
If (chkimg("***.bmp")=True)then tmp=1
If (chkimg("〇〇〇.bmp")=True)then tmp=2
If (chkimg("△△△.bmp")=True)then tmp=3
If (chkimg("×××.bmp")=True)then tmp=4

select tmp
case 1
call □□□.uws
case 2
BTN(LEFT, CLICK, G_IMG_X+50, G_IMG_Y+10, 5)
case 3
BTN(LEFT, CLICK, G_IMG_X+50, G_IMG_Y+10, 5)
case 4
BTN(LEFT, CLICK, G_IMG_X+50, G_IMG_Y+10, 5)
Default
BTN(LEFT, CLICK, G_IMG_X+50, G_IMG_Y+10, 5)

selend


→このスクリプトを◆.uwsとして保存し、

For 回数 = 1 to 50
call ◆.uws
next

exit

→とりあえず50回だけ回す設定にしました。
50回だけまわすこのスクリプトをuwscに読み込ませてマクロを起動させましたができませんでした。


説明しきれてないところや分かりにくいところがございましたら
わかる範囲でお答えしますので、よろしくお願いします。

質問者からの補足コメント

  • 何がどうできなかったか記載するのを忘れていました。。
    すみません。

    エラーが出るわけではなく、マクロ自体は回っているみたいです
    指定の画像が認識しないのです。

    それぞれ個々では回るみたいなのですが
    caseに入れると画像を認識してくれなくなってしまいます。。

    No.2の回答に寄せられた補足コメントです。 補足日時:2018/04/26 23:30
  • □□□.uwsの中身は***.uwsの画像を認識して別の座標を連続タッチするというような内容になっております。
    お教えいただいた内容の
    WHILE TRUE
    SLEEP(0.1) //念のため
    IF GETKEYSTATE(VK_ESC) THEN BREAK

    WEND
    こちらはどのあたりに入れればよいのでしょうか、
    ほんとに右も左もわからなくてすみません、、

    クリックの座標が仮にずれていたら、そのずれている座標にカーソルが移動すると思うのですがそのようなこともなかったので、、

    No.1の回答に寄せられた補足コメントです。 補足日時:2018/04/26 23:46
  • caseを使わないでこの画像を認識したらクリックするというマクロそれぞれ別に組んでみて回してみると、その画像自体は認識してクリックしてくれるんです、、、

    何らかの理由でマッチしていない可能性があるんですかね、、

    No.3の回答に寄せられた補足コメントです。 補足日時:2018/04/27 10:51
  • ◆.uwsのみで実行し再確認したところ、
    case1以外は認識してくれませんでした、
    認識せずにそのままマクロが終了するといった感じです。


    4種類の画像がいっぺんに同じモニター中には表示されることはないんです。
    仮に表示されたとすると4になるんですね、、

    色幅の指定なんてあるんですか、、!
    それはどうやったらよいのでしょうか、、

    No.4の回答に寄せられた補足コメントです。 補足日時:2018/04/27 11:17
  • 変数:VK_ESKが定義されていません
    3行目:IF GETKEYSTATE(VK_ESK) THEN BREAK

    とエラーがでてきます、、

    わざわざcaseをつけなくてもループのマクロを組めばクリックしてくれるってことですね
    盲点でした、、

    WHILE chkimg("C:\Users\貴方のユーザ名\Pictures\***.bmp")
    SLEEP(0.1)
    WEND

    これはどこに書けばいいのですか、、?
    tmp=0の下の
    If (chkimg("C:\Users\担当\Desktop\uwsc5302\クリア.bmp")=True)then tmp=1
    にそれぞれwhileを組み込むのか

    またcaseとは別にしたに書き込めばよいのかどちらでしょうか、

    No.5の回答に寄せられた補足コメントです。 補足日時:2018/04/27 11:28

A 回答 (6件)

> とエラーがでてきます、、



ESKじゃなくて、ESCです。スペルミスですね。

> にそれぞれwhileを組み込むのか

そうです。狙った画像が消えたかどうかは、それぞれのIFBの中で判定します。IFだと複数行に渡る処理を内蔵できないので、IFB~ENDIFを使ってください。ただ消えた確認は入れなくてもいける可能性も高いんで、まずは入れずにやってみては?

それと、IFBを4つ使ってそれぞれのクリック処理をそこに書いた場合は、SELECT~SELENDの処理は全部不要になり、変数tmpも不要になります。非常に単純になりますね。


WHILE TRUE
SLEEP(0.1) //念のため
IF GETKEYSTATE(VK_ESC) THEN BREAK

//1つ目の画像の判定
IFB chkimg("C:\Users\担当\Desktop\uwsc5302\クリア.bmp")
BTN(LEFT, CLICK…
//(場合によってはここに消えるのを待つ処理を入れる)
ENDIF

//2つ目の画像の判定

1つ目と同じ感じでIFBを書く。残りも一緒


WEND
    • good
    • 0

> こちらはどのあたりに入れれば



実はとっても簡単で、◆.uwsをこのループの中に入れてしまえばいいです。

WHILE TRUE
SLEEP(0.1) //念のため
IF GETKEYSTATE(VK_ESC) THEN BREAK

tmp=0
If (chkimg("***.bmp")=True)then tmp=1

中略

BTN(LEFT, CLICK, G_IMG_X+50, G_IMG_Y+10, 5)

selend

WEND

ということです。こうすればこのスクリプト単体で実行できるし、反応してなさそうだったらESCキーで止められます。

あと画像認識の場合、画像ファイル名はフォルダ名も指定すべきですね。フォルダ名を省略すると、スクリプトと同じフォルダを見に行くと思いました。なので…

chkimg("***.bmp")
ではなく、

chkimg("C:\Users\貴方のユーザ名\Pictures\***.bmp")
のように、画像を入れているフォルダをフルパス指定しろってことです。

あと懸念事項として、クリックする対象がクリックしてもすぐには消えない場合は、消えるまで何度もクリックしてしまいます。今回提案してる方法だったらループ内にSLEEP(0.1)が入ってるので、この間に消えてくれるとは思いますが、場合によっては消えるのを待つ処理が必要になるかも知れません。以下がその例で、***.bmpで指定されたものが画面から消えるまでループが実行され続けます。

WHILE chkimg("C:\Users\貴方のユーザ名\Pictures\***.bmp")
SLEEP(0.1)
WEND

最後にもう1点、最初にIFで4つ判定してるけど、これは判定したその場でクリック処理を行う方が必ず全ての画像をクリックできるし、わかりやすいです。

IFB chkimg("C:\Users\貴方のユーザ名\Pictures\***.bmp")
BTN(LEFT, CLICK…
//(場合によってはここに消えるのを待つ処理を入れる)
ENDIF

IFB chkimg("C:\Users\貴方のユーザ名\Pictures\〇〇〇.bmp")
BTN(LEFT, CLICK…
//(場合によってはここに消えるのを待つ処理を入れる)
ENDIF

マウスカーソルの指摘もありますが、それの影響は受けないので平気です。Print Screenで画面キャプチャして、画像内に入ってこないものはCHKIMGの認識対象外になります。
この回答への補足あり
    • good
    • 1

デバッガがあるならステップ実行を、無いならログ出力して


どういう状態なのか把握した方が良いです。

以下補足コメントがあれば解決の糸口になるかもしれません。
 ◆.uwsだけ実行した場合判定できますか?
 ループで実行した時だけ判定できないということですか?
 2回目以降のループ時、マウスカーソルが邪魔してませんか?


まず、
If (chkimg("***.bmp")=True)then tmp=1

と連続しているくだり。
勝ち抜きになっていないので、4種類の画像が画面上にある時はtmpは必ず4になるけど問題無い?
とりあえずselect 文の前に
print tmp など追加して、判定ができているか確認すべきです。

また、認識する画像の色幅を持たせ、判定を甘くしてみる方法も1つ
引数未指定なので完全一致しない限り見つかった と判定されないので
第8引数の色幅を指定してみてください。

マウスカーソルが画像認識の邪魔をするようであれば、
仮でselendの後にMMV(0,0)など入れて、マウスカーソルを端に追いやるなどすると良いかも。
この回答への補足あり
    • good
    • 1

> 指定の画像が認識しないのです。



じぶんのとこでは認識してクリックしてます。
画像ファイルがまずいか、画像が表示されていない、画像がアニメーションとかしていてマッチしないとかでは。
この回答への補足あり
    • good
    • 1

> ができませんでした。



何をどうしたら、何がどうなるはずのものが、何がどうなってできなかった?

自分のところだと、実際の処理はともかく、ループは回ってるようでしたが。
この回答への補足あり
    • good
    • 1

□□□.uws とやらがどんなスクリプトなのかも気になりますが、おそらく50回ループではすぐに終わってしまい、確認にならなさそうな予感がします。

こういう変化待ちの場合は以下みたいな無限ループにしておいて、キーが押されたらループを抜けるようにした方が都合がいいと思います。以下の例では、ESCキーを押すとループが終わります。これだと◆.uwsとして保存してCALLする必要もありません。

WHILE TRUE
SLEEP(0.1) //念のため
IF GETKEYSTATE(VK_ESC) THEN BREAK

WEND

あと、G_IMG_X+50 とかがクリック目標から外れちゃってるってオチはないですよね?確かにG_IMG_Xだけだとぴくっとでもマウスが動くと誤動作する危険がありますが、+50はずいぶんでかいよなと思ったんで。
この回答への補足あり
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!