外出自粛中でも楽しく過ごす!QAまとめ>>

画面上のアイテム(5mm四方の点など)が消失した時、
それを認識して任意の場所を自動的にクリックしてくれるような
ソフトはないでしょうか。

または、画面上の特定の部分の色が変化したときに、
それを認識して任意の場所を自動的にクリックしてくれるような
ソフトはないでしょうか。

クリックを繰返し行ってくれるものや、
特定の時間に特定の場所をクリックしてくれるものはあるようなのですが、
画面上の変化がクリック発動のトリガーになるものがないか探しています。

非常に偏った質問ですが、よろしくお願いします。

A 回答 (5件)

ANo.2のものです。



>ただ、今回スクリプトの画面サイズの部分を
>
>// 画面サイズ
>CONST X_MAX = 1680
>CONST Y_MAX = 1050
>
>と書き直して実行した際、上記のエラーが発生したので、
>UWSCというものは画面サイズ1024×768までしか、
>命令できないんでしょうか。

失礼しました。配列のインデックス計算にバグがありました。
UWSCは2次元配列が使えるようですので、OldColorを2次元配列に修正しました。プログラムとしてもこの方が読みやすいと思いますし。
また、画面サイズを示す特殊変数(G_SCREEN_W,G_SCREEN_H)がありましたので、使用してみました。いままでのように数値を直接記入することでも問題ありません。

// 画面サイズ
CONST X_MAX = G_SCREEN_W
CONST Y_MAX = G_SCREEN_H

DIM OldColor[X_MAX][Y_MAX];

// X座標変化範囲を指定
CONST X_START = 1421
CONST X_END = 1425

// Y座標変化範囲を指定
CONST Y_START = 480
CONST Y_END = 483

Total = ((X_END - X_START) + 1) * ((Y_END - Y_START) + 1)

// 起動時の指定範囲の色を得る
FOR x = X_START to X_END
  FOR y = Y_START to Y_END
    OldColor[x][y] = PEEKCOLOR( x, y ) // 座標(x,y)の色を得る
  NEXT
NEXT

WHILE True
  Count = 0
  
  // 起動後の指定範囲の色を得て、変化をチェックする
  FOR x = X_START to X_END
    FOR y = Y_START to Y_END
      NewColor = PEEKCOLOR( x, y )
      
      // 変化あり?
      IFB NewColor <> OldColor[x][y]
       Count = Count + 1
      ENDIF
    NEXT
  NEXT
  
  // 指定範囲の全ての色が変化?
  IFB Count = Total
    BREAK
  ENDIF
WEND

MSGBOX("指定範囲の全ての色が変化しました")

この回答への補足

念のため採択は少し時間を置いてから(長くて1週間程度)行わせていただきます。

補足日時:2008/10/19 21:03
    • good
    • 0
この回答へのお礼

ご回答ならびにご検討、誠にありがとうございました。

>UWSCは2次元配列が使えるようですので、OldColorを2次元配列に修正しました。
>プログラムとしてもこの方が読みやすいと思いますし。

プログラムに疎い私にはよく理解できませんでしたが、
実際にプログラムを走らせて見たところ、
見事に問題が解消されておりました。
とても、使いやすくなりました。
ありがとうございました。
私ももう少し理解できるよう頑張りたいと思います。

この度は長々と親切にご伝授して頂きまして
誠にありがとうございました。
この感謝の気持ちを大事にしたいと思います。
本当にありがとうございました。
失礼致します。

お礼日時:2008/10/19 21:02

ANo.2のものです。



>また、もし可能であれば参考までにお聞きしたいのですが、
>実際に色の変化を監視する座標範囲を
>スクリプトに書き込んで実行しようとすると、
>
>>Uスクリプト:変数:OLDCOLOR配列をオーバーしています。
>>22行目:OLDCOLOR[IDX]=PEEKCOLOR(X,Y)
>
>という、警告が出る場合が多々あります。
>座標範囲を少しずらすなどすると問題が解消される場合があるのですが、
>もし原因がわかりましたらお願い致します。

具体的にどのような修正されたのかが分からないので推測になりますが、画面サイズ1024×768を超える座標を指定しているのかもしれません。

>最終的には目標を達せられたようですが、
>少し不安の残る結果となりました。
>再度、検討を繰り返していきたいと思います。

具体的な仕様を示していただければ、的確なアドバイスができるかもしれませんが、仕様を想像して回答しているため、少しズレたアドバイスになってしまったかもしれませんね。

この回答への補足

再度、ご回答ありがとうございます。
大変感謝致します。
また、言葉足らずで申し訳ありません。

>画面サイズ1024×768を超える座標を指定しているのかもしれません。

まさにそれが原因のようです。
画面サイズ1680×1050で使用した為、
部分的に使用可能な範囲(1024×768範囲内)があるだけで、
指定場所によってはプログラムを走らせることができたようです。

ただ、今回スクリプトの画面サイズの部分を

// 画面サイズ
CONST X_MAX = 1680
CONST Y_MAX = 1050

と書き直して実行した際、上記のエラーが発生したので、
UWSCというものは画面サイズ1024×768までしか、
命令できないんでしょうか。


*************************(失敗例1)*****************************
// 画面サイズ
CONST X_MAX = 1680
CONST Y_MAX = 1050

DIM OldColor[X_MAX * Y_MAX];

// X座標変化範囲を指定
CONST X_START = 1421
CONST X_END = 1425

// Y座標変化範囲を指定
CONST Y_START = 480
CONST Y_END = 483

Total = ((X_END - X_START) + 1) * ((Y_END - Y_START) + 1)

// 起動時の指定範囲の色を得る
FOR x = X_START to X_END
FOR y = Y_START to Y_END
Idx = (x * X_MAX) + y

OldColor[Idx] = PEEKCOLOR( x, y ) // 座標(x,y)の色を得る
NEXT
NEXT


WHILE True
Count = 0

// 起動後の指定範囲の色を得て、変化をチェックする
FOR x = X_START to X_END
FOR y = Y_START to Y_END
NewColor = PEEKCOLOR( x, y )

Idx = (x * X_MAX) + y

// 変化あり?
IFB NewColor <> OldColor[Idx]
Count = Count + 1
ENDIF
NEXT
NEXT

// 指定範囲の全ての色が変化?
IFB Count = Total
BREAK
ENDIF
WEND

BTN( LEFT,CLICK)

****************************(成功例)****************************

// 画面サイズ
CONST X_MAX = 1680
CONST Y_MAX = 1050

DIM OldColor[X_MAX * Y_MAX];

// X座標変化範囲を指定
CONST X_START = 1011
CONST X_END = 1018

// Y座標変化範囲を指定
CONST Y_START = 430
CONST Y_END = 442

以下略
***************************(失敗例2:1ドット検出)*************************

// 画面サイズ
CONST X_MAX = 1680
CONST Y_MAX = 1050

DIM OldColor[X_MAX * Y_MAX];

// X座標変化範囲を指定
CONST X_START = 1011
CONST X_END = 1018

// Y座標変化範囲を指定
CONST Y_START = 430
CONST Y_END = 442

Total = ((X_END - X_START) + 1) * ((Y_END - Y_START) + 1)

// 起動時の指定範囲の色を得る
FOR x = X_START to X_END
FOR y = Y_START to Y_END
Idx = (x * X_MAX) + y

OldColor[Idx] = PEEKCOLOR( x, y ) // 座標(x,y)の色を得る
NEXT
NEXT


WHILE True
Count = 0

// 起動後の指定範囲の色を得て、変化をチェックする
FOR x = X_START to X_END
FOR y = Y_START to Y_END
NewColor = PEEKCOLOR( x, y )

Idx = (x * X_MAX) + y

// 変化あり?
IFB NewColor <> OldColor[Idx]
Count = Count + 1
ENDIF
NEXT
NEXT

// 指定範囲の全ての色が変化?
IFB Count = 1
BREAK
ENDIF
WEND

BTN( LEFT,CLICK)

補足日時:2008/10/18 20:37
    • good
    • 0

ANo.2のものです。



>あとは、自分の使用するPC画面大きさに数値を合わせ、
>モニターしたい座標範囲は、マウスカーソルの現在座標を
>教えてくれるプログラムを使用して、数値を計測し、
>その値に書き換えれば、良いということで間違いないでしょうか?
>例)画面左上から、だいたいXに5mm、Yに5mm進んだ四方5mm程の範囲は
>  座標(7,7)~(12,12)の全変化を検出する
>というように、スクリプトを書き換えればいいと、認識しています。

上記の認識であっています。

>メッセージボックスで色が変化したことを教えてくれるもののようですが、
>色が変化した直後に、クリックを発動してくれると大変うれしく思います。
>贅沢を言ってしまい申し訳ありません。

クリックはBTN命令を使用します。
座標(100,100)をクリックしたいのであれば、MSGBOXの部分を、BTN( LEFT,CLICK, 100, 100)とすればよいです。

もし、変化したドット位置をクリックしたいということであれば、「Count = Count + 1」を「BREAK 3」に変更して、MSGBOXの部分を、BTN( LEFT,CLICK, x, y)とすればよいです。

ANo.2のスクリプトは起動時の画面との変化をチェックするので、リアルタイムな変化を繰り返し検出するのであれば、修正が必要となります。

変化したドット位置を繰り返しチェックしてクリックするスクリプトは以下のようになります。(前回のスクリプトからの変更点のみ)
ドット単位の処理なので、複数のクリックが行われますので、ご希望の動きとは異なると思いますが、、、

WHILE True
  WHILE True
    // 起動後の指定範囲の色を得て、変化をチェックする
    FOR x = X_START to X_END
      FOR y = Y_START to Y_END
        NewColor = PEEKCOLOR( x, y )
        
        Idx = (x * X_MAX) + y
        
        // 変化あり?
        IFB NewColor <> OldColor[Idx]
          OldColor[Idx] = NewColor
          BREAK 3
        ENDIF
      NEXT
    NEXT
    
    SLEEP(0.1)
  WEND
  
  //マウスクリック
  BTN( LEFT,CLICK, x, y)
WEND

なお、私は使用したことがありませんが、指定した画像が画面上にあるかチェックするCHKIMGという命令があります。アイテム消失したときの画像が明確なら、こちらを使用したほうが良さそうですね。

この回答への補足

余談なのかもしれませんが、
いろいろとスクリプト文を組み合わせて、
試行錯誤しているのですが、

監視範囲内の
>1ドットだけの変化を検出したい場合は、
>IFB Count = TotalをIFB Count = 1に変更すれば良い

との事でしたので、それも試してみたのですが、
感度が高すぎるのか、すぐに変化があったと報告があがります。

そこで、Count数を上げるなどしてみたのですが、
それもどうもうまくいきませんでした。

最終的には目標を達せられたようですが、
少し不安の残る結果となりました。
再度、検討を繰り返していきたいと思います。

補足日時:2008/10/17 18:54
    • good
    • 0
この回答へのお礼

再度ご回答ありがとうございます。
丁寧にいろいろな提案をして頂きまして誠にありがとうございます。

前半のプログラムで、目的を達することができました。

最後のBTNの命令の際、クリック位置の指定を行わない場合は、
スクリプトに入力した座標位置を空白にすればよいようですね。

しかし、まだ、若干のタイムラグが発生するようなので、
後半に提案して頂いたプログラムも、できるかわかりませんが、
試してみたいと思います。

gooサイトに画像判定のプログラムの質問をされている方が
いるようなので、そちらを参考に頑張ってみたいと思います。

また、もし可能であれば参考までにお聞きしたいのですが、
実際に色の変化を監視する座標範囲を
スクリプトに書き込んで実行しようとすると、

>Uスクリプト:変数:OLDCOLOR配列をオーバーしています。
>22行目:OLDCOLOR[IDX]=PEEKCOLOR(X,Y)

という、警告が出る場合が多々あります。
座標範囲を少しずらすなどすると問題が解消される場合があるのですが、
もし原因がわかりましたらお願い致します。

この度はご親切な回答誠にありがとうございました。
とても嬉しく思います。

難しいかもしれませんが、私も少しでもプログラムを学んで、
運用していけるようになっていきたいと思いました。
ありがとうございました。

お礼日時:2008/10/17 17:05

UWSCをご存知だということなので、UWSCでスクリプトを作成してみました。


座標(0,0)~(4,4)の全変化を検出するまで実行するスクリプトです。1ドットだけの変化を検出したい場合は、IFB Count = TotalをIFB Count = 1に変更すれば良いです。

具体的な使用例を教えていただければ、もっと具体的にアドバイスできると思います。

即興で作成したものなので、バグがあった場合はご了承ください。

// 画面サイズ
CONST X_MAX = 1024
CONST Y_MAX = 768

DIM OldColor[X_MAX * Y_MAX];

// X座標変化範囲を指定
CONST X_START = 0
CONST X_END = 4

// Y座標変化範囲を指定
CONST Y_START = 0
CONST Y_END = 4

Total = ((X_END - X_START) + 1) * ((Y_END - Y_START) + 1)

// 起動時の指定範囲の色を得る
FOR x = X_START to X_END
FOR y = Y_START to Y_END
Idx = (x * X_MAX) + y

OldColor[Idx] = PEEKCOLOR( x, y ) // 座標(x,y)の色を得る
NEXT
NEXT


WHILE True
Count = 0

// 起動後の指定範囲の色を得て、変化をチェックする
FOR x = X_START to X_END
FOR y = Y_START to Y_END
NewColor = PEEKCOLOR( x, y )

Idx = (x * X_MAX) + y

// 変化あり?
IFB NewColor <> OldColor[Idx]
Count = Count + 1
ENDIF
NEXT
NEXT

// 指定範囲の全ての色が変化?
IFB Count = Total
BREAK
ENDIF
WEND

MSGBOX("指定範囲の色が変化しました")

この回答への補足

ご回答ありがとうございます。
非常に親切な回答に感激しております。ありがとうございました。
当方、プログラムは初心者なので、詳しくはわからないのですが、
プログラムを走らせることはできました。
ありがとうございます。

あとは、自分の使用するPC画面大きさに数値を合わせ、
モニターしたい座標範囲は、マウスカーソルの現在座標を
教えてくれるプログラムを使用して、数値を計測し、
その値に書き換えれば、良いということで間違いないでしょうか?

例)画面左上から、だいたいXに5mm、Yに5mm進んだ四方5mm程の範囲は
  座標(7,7)~(12,12)の全変化を検出する

というように、スクリプトを書き換えればいいと、認識しています。
さらに、その四方5mmの範囲内の1ドットのみの変化を見たいときは
IFB Count = TotalをIFB Count = 1にすれば、いいと認識しています。

それから、このスクリプトでは色が変化した場合、
メッセージボックスで色が変化したことを教えてくれるもののようですが、
色が変化した直後に、クリックを発動してくれると大変うれしく思います。
贅沢を言ってしまい申し訳ありません。

クリックの位置は予め、マウスのカーソルを合わせておけば、
いいと考えているので、座標指定を含んだスクリプトでなくても
いいと思います。

具体的用途としては、反射神経を問うようなクリックゲームを
イメージして頂ければ良いと思います(実際は異なるのですが)。

画面上のアイテムを監視し、アイテム消失したとき、瞬時にボタンを押して、そのタイムを競う。
そのようなゲームをイメージして頂ければ良いと思います。

この度は親切な回答ありがとうございました。
引き続きアドバイス頂けますと大変うれしく思います。
よろしくお願い致します。

補足日時:2008/10/13 22:39
    • good
    • 0

UWSCというソフトで可能でしょうね。


ただし少々プログラミングの知識が要ります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
そのソフトは知っていたのですが、
やはりプログラムを自作するしかないのですかね。
検討させて頂きます。

お礼日時:2008/10/11 12:57

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QUWSCでPEEKCOLORを使い指定ウィンドウ内に、指定したカラーコ

UWSCでPEEKCOLORを使い指定ウィンドウ内に、指定したカラーコードがあるかを判別して
そこをクリックさせたいのですが、画像認識の場合

ACW(GETID("xxxxx"),880,0,800,600,0)
CHKIMG("xxxx.bmp",0)
x=G_IMG_X // 画像の座標をxへ代入
y=G_IMG_Y // 画像の座標をyへ代入
BTN(LEFT, CLICK, x+30, y-30, 60)

x=G_IMG_X という命令で指定ウィンドウ内の画像を(x,y)座標に自動で代入してもらえるのですが、PEEKCOLORの場合はどういった書き方をすればいいのでしょうか??

上手く言いたいことが伝わっているか不安ですが、理解できる方宜しくお願いします。

Aベストアンサー

>PEEKCOLORの後にBTN命令入れましたが、指定カラーコード以外の場所でも手当たり次第クリックしてしまってます。

それって、次みたいにしたってことですか?だったら当然そうなります。

ダメな例:
For x=1 to 800
 For y=1 to 600
  If PeekColor(x,y)=探しているカラーコード Then Break 2
  Btn(LEFT,CLICK,x,y)
 Next
Next

良い例1:
For x=1 to 800
 For y=1 to 600
  If PeekColor(x,y)=探しているカラーコード Then Break 2
 Next
Next
Btn(LEFT,CLICK,x,y)


良い例2:
For x=1 to 800
 For y=1 to 600
  Ifb PeekColor(x,y)=探しているカラーコード
   Btn(LEFT,CLICK,x,y)
   Break 2
  EndIf
 Next
Next

Quwsc画像認識のあいまい判定について

uwscのCHKIMG関数にて画像を判定したマクロを組むことは出来たのですが、1ドットでも変化があると同じ画像として判定されません。

しかし調べてみると、あるブログにはuwscで画像のあいまい判定が可能と書いてありました。
もしかしたらほかに情報が出てこない以上、失礼ですがそのブログの人の勘違いという可能性もありますが、検索して出来た以上気になります。これは可能なのでしょうか?可能なのでしたら方法を教えていただけませんか?

あと今回のことにはあまり関係ありませんが、uwscのヘルプが目次で項目をクリックしているのですが表示されません。開き方が間違っているんでしょうか?

Aベストアンサー

>しかし調べてみると、あるブログにはuwscで画像のあいまい判定が可能と書いてありました。

どうやら有志の方がCHKIMGXという拡張関数を作成されているようですよ。
調べてみてください。

QUWSC画像認識で座標の位置がずれてしまいます。

ifb CHKIMG( "XXX", -1, 0, 0, 0, 0, -1,  )
x=G_IMG_X // 画像の座標をxへ代入
y=G_IMG_Y // 画像の座標をyへ代入
endif

パソコンを変えた途端にこの症状は発生しました。

x,yの変数をメッセージボックスで出しているのですが、実際の画像と異なった座標を指定していまいます。

他の座標ツールとは座標が異なっているのです。

画像をクリックしてみても、実際の画像の位置とは違う場所をクリックしてしまいます。



画像の座標は一番左上が表示されることは存じております。

グラフィックボードを実装しています。OSのバージョンは8.1です。
原因は何が考えられるでしょうか。ご教授お願いいたします。

Aベストアンサー

まず最初に関数の使い方がおかしいです。
戻値 = CHKIMG( [画像名, 透過色/色無視, x1, y1, x2, y2, 番号, 色幅] )

>ifb CHKIMG( "XXX", -1, 0, 0, 0, 0, -1,  )

正しく書くなら
ifb CHKIMG( "XXX", -1, 0, 0, 0, 0, -1 )
もっと言えば、x2,y2の範囲を指定すべきです。
指定する座標は絶対値です。


画面全体から指定した画像が無いか調査する
CHKIMG( "XXX", -1, 0, 0, G_SCREEN_W, G_SCREEN_H, -1 )


ただし、画面全体からでは動作が結構重くなります。

以下のようなスクリプトで予め画像の座標の確認をしてから調整しておくと動作が軽快になります


// 左クリックしたマウス位置を表示
Ifb GETKEYSTATE( VK_LBUTTON ) = TRUE THEN
MSGBOX ("マウスX座標" + G_MOUSE_X + " マウスY座標" + G_MOUSE_Y)
Endif


認識させる画像の大きさにも依存しますが、多少のずれを考慮し
大体の場所±100くらいを画像の検索範囲として設定するといいかもしれません。

まず最初に関数の使い方がおかしいです。
戻値 = CHKIMG( [画像名, 透過色/色無視, x1, y1, x2, y2, 番号, 色幅] )

>ifb CHKIMG( "XXX", -1, 0, 0, 0, 0, -1,  )

正しく書くなら
ifb CHKIMG( "XXX", -1, 0, 0, 0, 0, -1 )
もっと言えば、x2,y2の範囲を指定すべきです。
指定する座標は絶対値です。


画面全体から指定した画像が無いか調査する
CHKIMG( "XXX", -1, 0, 0, G_SCREEN_W, G_SCREEN_H, -1 )


ただし、画面全体からでは動作が結構重くなります。

以下のようなスクリプト...続きを読む

QUWSC 画像認識で条件分岐

画像Aが出てくるまで待ち画面をクリック、その後、画像Bが出てくるまで待ち画面をクリック。
画像Aが現れなければ、画像Bが出てくるまで待ち、画像をクリックする。
という文を書きたいのですが、うまくいきません。

画像Aはランダムで現れます。画像Aが現れた場合、画面をクリックしない限り、画像Bは現れません。

以下の文では画像Aが現れない限りはうまく回るのですが、画像Aが現れるとそこで止まってしまいます。どこがまずいのでしょうか。
何分この手のものエクセルぐらいしか触ったことがなく困っています。よろしくお願いします。
//
if chkimg("A.bmp")=true then
btn(left,0,100,100,50)
else
repeat
sleep(0.2)
until chkimg("B.bmp")=true
btn(left,0,100,100,50)
endif
//

Aベストアンサー

> 以下のように記述してみたんですが

完璧じゃないですか!画像Aがクリックしたい目標物だったら、確かにG_IMG_X,G_IMG_Yを使うのが一番確実な方法です。これだと、もし画像Aの表示される場所が変わっても影響を受けませんから。ただG_IMG_X,G_IMG_Yは画像の左上隅を指しているため、個人的には気味が悪いと感じるので(すごいギリギリの場所をクリックしているわけだから)、4くらい足しています。画像がクリック目標に対して余白を持っている場合は、足す数が4では足りない場合もあります。

ちなみにG_IMG_Xを変数にコピーせずに使うことも可能なので、それでやると大幅に短く書けます。

REPEAT
SLEEP(0.1)
IF chkimg("A.bmp") Then BTN(left,0,G_IMG_X,G_IMG_Y,50)
UNTIL chkimg("B.bmp")
BTN(left,0,100,100,50)

> 私が質問文であげていたのでは、画像Aをチェックする文に繰り返し処理がかかって
> いなかったのですね。それで止まっていたんだと思います。

VBAだけ見てきた人が知ってる世界とUWSCはかなり異質なものなので、迷って当然と思います。VBAはある意味普通のVBと同じくイベント駆動型の言語だから、クリックイベントなどの中に処理を書いておけば、いちいちループで繰り返し見張っている必要がないのに対し、UWSCにはイベントの概念がなく、クリックもキー入力もスクリプトに書いた場所でしか判定されない、よって繰り返しにしないと一回しか見てくれない。またVBAだとマクロの最終行に来ても次の操作が来るまで待機するだけだけど、UWSCではスクリプトが終了する等。

> 以下のように記述してみたんですが

完璧じゃないですか!画像Aがクリックしたい目標物だったら、確かにG_IMG_X,G_IMG_Yを使うのが一番確実な方法です。これだと、もし画像Aの表示される場所が変わっても影響を受けませんから。ただG_IMG_X,G_IMG_Yは画像の左上隅を指しているため、個人的には気味が悪いと感じるので(すごいギリギリの場所をクリックしているわけだから)、4くらい足しています。画像がクリック目標に対して余白を持っている場合は、足す数が4では足りない場合もあります。

ちなみにG_IMG_Xを...続きを読む


人気Q&Aランキング