• ベストアンサー

画面認識型の自動クリックソフトを探しています。

画面上のアイテム(5mm四方の点など)が消失した時、 それを認識して任意の場所を自動的にクリックしてくれるような ソフトはないでしょうか。 または、画面上の特定の部分の色が変化したときに、 それを認識して任意の場所を自動的にクリックしてくれるような ソフトはないでしょうか。 クリックを繰返し行ってくれるものや、 特定の時間に特定の場所をクリックしてくれるものはあるようなのですが、 画面上の変化がクリック発動のトリガーになるものがないか探しています。 非常に偏った質問ですが、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • koyaduka
  • ベストアンサー率33% (1/3)
回答No.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("指定範囲の全ての色が変化しました")

pokemo
質問者

お礼

ご回答ならびにご検討、誠にありがとうございました。 >UWSCは2次元配列が使えるようですので、OldColorを2次元配列に修正しました。 >プログラムとしてもこの方が読みやすいと思いますし。 プログラムに疎い私にはよく理解できませんでしたが、 実際にプログラムを走らせて見たところ、 見事に問題が解消されておりました。 とても、使いやすくなりました。 ありがとうございました。 私ももう少し理解できるよう頑張りたいと思います。 この度は長々と親切にご伝授して頂きまして 誠にありがとうございました。 この感謝の気持ちを大事にしたいと思います。 本当にありがとうございました。 失礼致します。

pokemo
質問者

補足

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

その他の回答 (4)

  • koyaduka
  • ベストアンサー率33% (1/3)
回答No.4

ANo.2のものです。 >また、もし可能であれば参考までにお聞きしたいのですが、 >実際に色の変化を監視する座標範囲を >スクリプトに書き込んで実行しようとすると、 > >>Uスクリプト:変数:OLDCOLOR配列をオーバーしています。 >>22行目:OLDCOLOR[IDX]=PEEKCOLOR(X,Y) > >という、警告が出る場合が多々あります。 >座標範囲を少しずらすなどすると問題が解消される場合があるのですが、 >もし原因がわかりましたらお願い致します。 具体的にどのような修正されたのかが分からないので推測になりますが、画面サイズ1024×768を超える座標を指定しているのかもしれません。 >最終的には目標を達せられたようですが、 >少し不安の残る結果となりました。 >再度、検討を繰り返していきたいと思います。 具体的な仕様を示していただければ、的確なアドバイスができるかもしれませんが、仕様を想像して回答しているため、少しズレたアドバイスになってしまったかもしれませんね。

pokemo
質問者

補足

再度、ご回答ありがとうございます。 大変感謝致します。 また、言葉足らずで申し訳ありません。 >画面サイズ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)

  • koyaduka
  • ベストアンサー率33% (1/3)
回答No.3

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という命令があります。アイテム消失したときの画像が明確なら、こちらを使用したほうが良さそうですね。

pokemo
質問者

お礼

再度ご回答ありがとうございます。 丁寧にいろいろな提案をして頂きまして誠にありがとうございます。 前半のプログラムで、目的を達することができました。 最後のBTNの命令の際、クリック位置の指定を行わない場合は、 スクリプトに入力した座標位置を空白にすればよいようですね。 しかし、まだ、若干のタイムラグが発生するようなので、 後半に提案して頂いたプログラムも、できるかわかりませんが、 試してみたいと思います。 gooサイトに画像判定のプログラムの質問をされている方が いるようなので、そちらを参考に頑張ってみたいと思います。 また、もし可能であれば参考までにお聞きしたいのですが、 実際に色の変化を監視する座標範囲を スクリプトに書き込んで実行しようとすると、 >Uスクリプト:変数:OLDCOLOR配列をオーバーしています。 >22行目:OLDCOLOR[IDX]=PEEKCOLOR(X,Y) という、警告が出る場合が多々あります。 座標範囲を少しずらすなどすると問題が解消される場合があるのですが、 もし原因がわかりましたらお願い致します。 この度はご親切な回答誠にありがとうございました。 とても嬉しく思います。 難しいかもしれませんが、私も少しでもプログラムを学んで、 運用していけるようになっていきたいと思いました。 ありがとうございました。

pokemo
質問者

補足

余談なのかもしれませんが、 いろいろとスクリプト文を組み合わせて、 試行錯誤しているのですが、 監視範囲内の >1ドットだけの変化を検出したい場合は、 >IFB Count = TotalをIFB Count = 1に変更すれば良い との事でしたので、それも試してみたのですが、 感度が高すぎるのか、すぐに変化があったと報告があがります。 そこで、Count数を上げるなどしてみたのですが、 それもどうもうまくいきませんでした。 最終的には目標を達せられたようですが、 少し不安の残る結果となりました。 再度、検討を繰り返していきたいと思います。

  • koyaduka
  • ベストアンサー率33% (1/3)
回答No.2

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("指定範囲の色が変化しました")

pokemo
質問者

補足

ご回答ありがとうございます。 非常に親切な回答に感激しております。ありがとうございました。 当方、プログラムは初心者なので、詳しくはわからないのですが、 プログラムを走らせることはできました。 ありがとうございます。 あとは、自分の使用するPC画面大きさに数値を合わせ、 モニターしたい座標範囲は、マウスカーソルの現在座標を 教えてくれるプログラムを使用して、数値を計測し、 その値に書き換えれば、良いということで間違いないでしょうか? 例)画面左上から、だいたいXに5mm、Yに5mm進んだ四方5mm程の範囲は   座標(7,7)~(12,12)の全変化を検出する というように、スクリプトを書き換えればいいと、認識しています。 さらに、その四方5mmの範囲内の1ドットのみの変化を見たいときは IFB Count = TotalをIFB Count = 1にすれば、いいと認識しています。 それから、このスクリプトでは色が変化した場合、 メッセージボックスで色が変化したことを教えてくれるもののようですが、 色が変化した直後に、クリックを発動してくれると大変うれしく思います。 贅沢を言ってしまい申し訳ありません。 クリックの位置は予め、マウスのカーソルを合わせておけば、 いいと考えているので、座標指定を含んだスクリプトでなくても いいと思います。 具体的用途としては、反射神経を問うようなクリックゲームを イメージして頂ければ良いと思います(実際は異なるのですが)。 画面上のアイテムを監視し、アイテム消失したとき、瞬時にボタンを押して、そのタイムを競う。 そのようなゲームをイメージして頂ければ良いと思います。 この度は親切な回答ありがとうございました。 引き続きアドバイス頂けますと大変うれしく思います。 よろしくお願い致します。

  • SortaNerd
  • ベストアンサー率43% (1185/2748)
回答No.1

UWSCというソフトで可能でしょうね。 ただし少々プログラミングの知識が要ります。

pokemo
質問者

お礼

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

関連するQ&A

専門家に質問してみよう