AIと戦って、あなたの人生のリスク診断 >>

ある画像 aaa.bmp だったとします
この画像があるときは なにもせず なくなった場合(画像が消えるまで繰り返す)に ENTER ENTER と 押すようなスプリクト
を 書いて頂けないでしょうか?

While true
if GETKEYSTATE(VK_ESC) then exit
If ChkImg("aaa.bmp")=TRUE  ←画像があるとき?
Ifb and ChkImg("aaa.bmp")=FALSE ←画像が消えた時?
kbd(VK_ENTER)
kbd(VK_ENTER)
endif
wend

なんとか こんな感じまで 出来ました
よろしくお願いいたします

「UWSCで画像が消えた場合に動作せるやり」の質問画像

A 回答 (2件)

座標が特定できているんなら、指定した方がいいでしょう。

その方が多少なりとも速くなるし、誤動作の危険性も下げられますから。部分的に切り出した画像だと、偶然他のお店が全く同じになるかも知れません。

それと、Enterを2回押すという意味がわからないんですが、UWSCに押させると猛烈な高速になるので、押されたことを認識したりしなかったり不安定になることがあります。その場合は、kbd関数に待ち時間を入れてください。

kbd(VK_ENTER,50)

こうすると、Enterを押して50ミリ秒待ってから、次の動作に移行するようになります。
    • good
    • 0

惜しい、あと一歩のところまで来ている!こんな感じでできませんかね。



While true
  If GETKEYSTATE(VK_ESC) then exit
  If ChkImg("aaa.bmp") then Continue //画像があるのでループ先頭に戻る
  kbd(VK_ENTER)
  kbd(VK_ENTER)
wend

この回答への補足

ありがとう ございます
エラーもなく 動いたのですが 画像があってENTER おしてました!

画像の位置?座標 次第でしょうか

補足日時:2012/01/23 15:24
    • good
    • 0
この回答へのお礼

お店がいっぱい並んでいます 
この画像の一番↓の真ん中 に 私が立っています!
そのお店が消えたら ENTER を 押すようにできますでしょうか?
お店の画像は切り取って 保存しています!

私の立っている場所だけ認識できればいいのですが・・・

お礼日時:2012/01/23 15:52

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

QUWSC 画像判定と条件分岐について

UWSC 画像判定と条件分岐について質問です

1.画像Aがあるか判定する
2.画像Aがあれば、画像B又は画像Cをクリックする
3.画像Aなければ、sleepで少し秒数を開けてから1からやり直す
以降繰り返し

というプログラムを書きたいのですが、画面上の画像を判定して画像AがあるときだけB,Cをクリック
させる方法がよくわかりません。
加えてBを判定してクリック、Cを判定してクリックというのは
ifb部分を二つ使い別々に扱えば書けるのですが、 elseなど用いて一ブロックのifb-endifでの
表し方もよくわからないので合わせてそちらも教えていただきたいです

御回答よろしくお願いします

Aベストアンサー

> 加えてBを判定してクリック、Cを判定してクリックというのは

それは、画像BとCがどちらも存在するので両方ともクリックしておくと言うことか、それともBがなければCをクリックするのか、どっちでしょう?前者の場合はELSEは使わない(って言うか使えない)ので、IFを二つ並べるしか方法はないです。なぜなら、IFB~ELSE~ENDIFの形にすると、最初のIFBの条件を満たした場合はELSE以下は実行されず、ENDIFに抜けてしまいます。

と言うことを踏まえて書くと、次のような感じでしょうか。

While True
  Ifb ChkImg("画像A")
    Sleep(適当な待ち時間を入れる。待つ必要がなければこのSleep自体が不要)
    Ifb ChkImg("画像B")
      //画像Bをクリック。ただし見つけた座標より若干内側にしないと空振りの
      //危険があるので、+2している。この値は適当に調整のこと
      Btn(Left,Click,G_IMG_X+2,G_IMG_Y+2,20)
      //この後続けて画像Cもチェックしたい場合は、次のContinueを消す
      Continue
    EndIf
    If ChkImg("画像C") Then Btn(Left,Click,G_IMG_X+2,G_IMG_Y+2,20)
  EndIf
  Sleep(適当な待ち時間を入れる。)
Wend

ちなみにIFB~ELSE~ENDIFの書き方は、特に悩むことはなくて…

Ifb 条件
  条件成立時の処理
Else
  条件不成立時の処理
EndIf

の形になります。Elseの後でさらに条件判定をしたければ、ElseIfとするか、あるいはElseの下にさらにIfあるいはIfbを書きます。次のような感じで。

Ifb 条件A
  条件A成立時の処理
Else
  Ifb 条件A不成立時のさらなる条件B
    条件B成立時の処理
  EndIf
EndIf

> 加えてBを判定してクリック、Cを判定してクリックというのは

それは、画像BとCがどちらも存在するので両方ともクリックしておくと言うことか、それともBがなければCをクリックするのか、どっちでしょう?前者の場合はELSEは使わない(って言うか使えない)ので、IFを二つ並べるしか方法はないです。なぜなら、IFB~ELSE~ENDIFの形にすると、最初のIFBの条件を満たした場合はELSE以下は実行されず、ENDIFに抜けてしまいます。

と言うことを踏まえて書くと、次のような感じでしょうか。

While True
  Ifb Ch...続きを読む

QUWSC「画像が無い場合」

UWSCについての質問です
指定の画像がある場合、スクリプトを実行させるというのは分かりますが
逆に、画像が無い場合にのみ、特定のスクリプトを実行させるという事は可能でしょうか?

具体例としては
指定の画像がある場合は何もせず
指定の画像が消えた場合 msgbox("画像が消えました") とメッセージボックスを表示させる

よろしくお願い致します

Aベストアンサー

こうすればできます。簡単でしょ?

If ChkImg("探したい画像.bmp")=FALSE Then MsgBox("ないっぽいですぅ")

ただし、初めからなかった場合もこれで引っかかってしまうので、一度表示されてから消えたというのを検出したければ、次のようにする必要があります。

//初期化
あった=FALSE
//画像探しのループ
//目的の画像が一度見つかってそれが消えるまで回り続ける
Whlie TURE
  //他にやりたい処理があるならここに書く
  //画像の判定
  If ChkImg("探したい画像.bmp") Then あった=TRUE
  Ifb あった AND ChkImg("探したい画像.bmp")=FALSE
    MsgBox("消えたみたいですぅ")
    あった=FALSE
  EndIf
Wend

ついでに言うと、If文はTRUEかFALSEかを判定する文であり、関数だろうが式だろうが、判定できるのはTRUEかFALSEだけです。しかし逆を言うと、ChkImg関数のように結果がTRUEかFALSEで返る関数であれば、=TRUEなどといちいち書く必要はありません。なのでUWSCのサンプルでは、TRUEかFALSEを返す関数がIf文内にある場合、=TRUEという表記を省略しています。その方がスクリプトの見た目が簡潔にできますから。なのでサンプルがもしこれを省略していなかったら、この質問をする前に気付いていたでしょうね。

こうすればできます。簡単でしょ?

If ChkImg("探したい画像.bmp")=FALSE Then MsgBox("ないっぽいですぅ")

ただし、初めからなかった場合もこれで引っかかってしまうので、一度表示されてから消えたというのを検出したければ、次のようにする必要があります。

//初期化
あった=FALSE
//画像探しのループ
//目的の画像が一度見つかってそれが消えるまで回り続ける
Whlie TURE
  //他にやりたい処理があるならここに書く
  //画像の判定
  If ChkImg("探したい画像.bmp") Then あった=TRUE
  Ifb あった...続きを読む

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を...続きを読む

QUWSCについて

UWSCをつかって他のプログラムを起動させたいのですがかのうですか??

使いたいのはバッチファイルで拡張子が
.bat
です。

call関数はUWSCだけみたいで出来ませんでした。
どなたか分かる方教えてください。

宜しくお願いします

Aベストアンサー

> testフォルダーの中の
> test.batを起動したい場合は
> どのように記述すればいいのですか??

DOSCMD("test\test.bat")
で、実行できます。


> DOSCMD()関数でバッチファイルを呼び出した場合
> そこまでのディレクトリーのファルパスが自動で、
> 書かれてますよね??
> それはいらないのですが…

この質問の意味がよくわからないのですが、
バッチファイル内の実行コマンドイメージ出力が
不要というという意味であれば、
バッチファイルの先頭に
@ECHO OFF
を入れておけばよいです。

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でテキストファイルやExcelファイルを開きたいのですが、
FOPEN関数を使っても、たとえばテキストファイルを開こうと思っても開けません。

これはなぜでしょうか?
すべてのパソコンでダメでした。
OSはXPSP3、7SP1、です。
UWSCのバージョンは最新のバージョン(4.8e1)です。

UWSC.EXEのあるフォルダに、「test01.txt」を作成し、
fid=FOPEN("test01.txt",F_READ or F_WRITE)

と書いても、絶対パスで、

fid=FOPEN("C:\Users\user01\Desktop\uwsc\test01.txt",F_READ or F_WRITE)

と書いても、ダメでした。

その一行しか書いてないのがダメな原因なのでしょうか?

「C:\Users\user01\Desktop\uwsc\test01.txt」は
コマンドプロンプトやファイルを指定して実行、からは開けます。

アンチウィルスソフトは一時的にOFFにしてもだめでした。

OS(XPSP3)を再インストールして、ネットにつながず、
セキュリティソフトなしでやってみてもダメでした。

多分、自分が何か勘違いをしているのだと思いますが、
FOPEN関数は、ファイルを開いて表示するものだと思っていましたが
違うのでしょうか?

Webで検索すると、他のみなさんは開いているようなのですが・・・

ファイルのIDを取得するだけではだめで、ほかの記述も必要ということなのでしょうか?

ゆくゆくはExcelのファイルを普通に開きたいのです。
COMで開くような事例もあったので、それは試してみましたが、
Office2003のセキュリティの「中」設定が無視されて
開いてしまい、Auto_Openマクロも無視されたりで、
使いたくありません。
「中」設定のまま、「マクロを実行させるダイアログ」を
表示してExcelファイルを開きたいのです。

でもその前にということで、テキストファイルを試しにと思ったのですが
テキストファイルすら開けません。


何度かWeb検索しても一向に手がかりがつかめません。

大変すみませんが、どなたがご存知の方がいらっしゃったら、
よろしくご指導くださいませ。

UWSCでテキストファイルやExcelファイルを開きたいのですが、
FOPEN関数を使っても、たとえばテキストファイルを開こうと思っても開けません。

これはなぜでしょうか?
すべてのパソコンでダメでした。
OSはXPSP3、7SP1、です。
UWSCのバージョンは最新のバージョン(4.8e1)です。

UWSC.EXEのあるフォルダに、「test01.txt」を作成し、
fid=FOPEN("test01.txt",F_READ or F_WRITE)

と書いても、絶対パスで、

fid=FOPEN("C:\Users\user01\Desktop\uwsc\test01.txt",F_READ or F_WRITE)

と書いても、ダメでし...続きを読む

Aベストアンサー

fopenはuwscでファイルを開くための命令です。

> fid=FOPEN("test01.txt",F_READ or F_WRITE)

エラー値が返ってないのなら、

fline=FGET(fid, 1)

とかでflineに1行目が取得できるので、

print fline

なんかで表示できるはず。

--
> UWSCでテキストファイルやExcelファイルを開きたいのですが、

メモ帳(notepad.exe)やExcelでファイルを開くためには、例えば、

exec("C:\Windows\notepad.exe test01.txt")

などとして、メモ帳をアプリとして起動し、同時に引数を指定します。

QUWSCでエラー発生時の対処法について

UWSCで、エラーが発生したときに、特定の行、または指定されたファンクションへ飛ばしたいのですが、その方法はありますでしょうか?VBでいうOnErrorステートメントと同じ役割ができるものを探しています。

UWSCはエラーがでると、強制終了されてしまい、その後のプログラムの実行が止まってしまいますので、これを回避するためです。

当方、プログラムは素人ではありませんが、UWSCは始めてです。もし分かる方がいましたら、教えていただけませんでしょうか?

Aベストアンサー

こんにちは。

>UWSCはエラーがでると、強制終了されてしまい、その後のプログラムの実行が止まってしまいますので、これを回避するためです。

ANo.1 記載の通り、try ~ except ~ endtry で except 句に、実行時エラーが発生した時の処理を入れておくのがよいと思います。実行時エラーの種類によっては、もはやスクリプトエンジンの処理を中断する類のものと判断される場合があります。その場合はエラーをキャッチできません。

それも救済したい場合は、該当ロジックを別ファイル A.uws に切り出して、EXEC で UWSC.exe A.uws と起動させる。A.uws が異常終了しても EXEC した側の UWSC.exe は影響を受けない。そんな風に影響範囲を局所化することも可能ではあります。

QUWSCの終了の仕方

UWSCの終了の仕方

仕事でUWSCのマクロソフトを使っています。
一箇所の部分だけ素早くクリックをループさせるマクロをしていますが、
アプリケーションを開いて使うため、ALT+1などを押しても終了することなく
アプリケーション側のALT+1の動作があるので困っています。
ただただマウスを動かして終了しようとしても、どうすることもできなくて、
結局はログオフにしてしまいました。

UWSCを好きなときに一時停止、もしくは強制終了をすることは可能でしょうか?
やり方を教えて下さい。もし、プログラムなどで終了させる方法がありましたら
初心者でも分かるように教えて頂ければ幸いです。

Aベストアンサー

ループしているマクロの中に以下の一文を書いてください
If GetKeyState(Vk_Esc) Then Break

Escキーを押すとループから抜けます。

QUWSCの簡単なキーマクロなのですが・・・

マクロ全体を「While True」と「wend」で挟めば無限ループ無限ループの設定かと思います。
実際、このようなマクロが出来上がっており、使用しているのですが、この無限ループの中に指定回数ループを組み込むにはどの様にしたら良いのでしょうか?

マクロ事態は簡単なキーマクロで、簡略化して示すと以下のような感じになります。
~~~~~~~~~~~~~~
(1),While True
(2),KBD(VK_F10,CLICK,5000)//5秒間隔でF10をクリック
(3),KBD(VK_F1,CLICK,5000)//F1を1回
(4),KBD(VK_F11,CLICK,5000)//5秒間隔でF11をクリック
(5),KBD(VK_F1,CLICK,5000)//F1を1回
(6),KBD(VK_F2CLICK,5000)//F2を1回
(7),wend
~~~~~~~~~~~~~~
希望の指定回数ループというのは、
「(2)を10回実行」→「(3)を1回実行」→「(4)を10回実行」→「(5)を1回実行」
上記動作を「4回繰り返した後」→「(6)の実行」
コピペで指定回数貼り付ければ良いという案もあるかと思いますが、編集を伴い、その作業が少々煩雑です。

ご存知の方居りましたら、教えてください

マクロ全体を「While True」と「wend」で挟めば無限ループ無限ループの設定かと思います。
実際、このようなマクロが出来上がっており、使用しているのですが、この無限ループの中に指定回数ループを組み込むにはどの様にしたら良いのでしょうか?

マクロ事態は簡単なキーマクロで、簡略化して示すと以下のような感じになります。
~~~~~~~~~~~~~~
(1),While True
(2),KBD(VK_F10,CLICK,5000)//5秒間隔でF10をクリック
(3),KBD(VK_F1,CLICK,5000)//F1を1回
(4),KBD(VK_F11,CLICK,5000)//5秒間隔でF1...続きを読む

Aベストアンサー

「指定回数ループ」には「For Next 文」を使います。
 FOR 変数 = 初期値 TO 終了値
   処理
 NEXT 
と書きます。
これを使えばOK。
具体的には

(1),While True
for j=0 to 4
for i=0 to 10
(2),KBD(VK_F10,CLICK,5000)//5秒間隔でF10をクリック
next
(3),KBD(VK_F1,CLICK,5000)//F1を1回
for i=0 to 10
(4),KBD(VK_F11,CLICK,5000)//5秒間隔でF11をクリック
next
(5),KBD(VK_F1,CLICK,5000)//F1を1回
next
(6),KBD(VK_F2CLICK,5000)//F2を1回
(7),wend

となります。
実験してないですが、多分大丈夫かと。

for文にある「10」が指定回数になりますので、20にすれば20回動作します。
気をつけないければならないのは、for文で使っている変数「i」「j」です。
これがループ数を数えるカウンターですので、ループ内にループを入れる場合は変数を別々にすること。
でないと、カウンターのカウントアップがおかしなことになって、希望回数廻らなくなります。

「指定回数ループ」には「For Next 文」を使います。
 FOR 変数 = 初期値 TO 終了値
   処理
 NEXT 
と書きます。
これを使えばOK。
具体的には

(1),While True
for j=0 to 4
for i=0 to 10
(2),KBD(VK_F10,CLICK,5000)//5秒間隔でF10をクリック
next
(3),KBD(VK_F1,CLICK,5000)//F1を1回
for i=0 to 10
(4),KBD(VK_F11,CLICK,5000)//5秒間隔でF11をクリック
next
(5),KBD(VK_F1,CLICK,5000)//F1を1回
next
(6),KBD(VK_F2CLICK,5000)//F2を1回
(7),wend

と...続きを読む

QUWSC

最初から飛ばして(ジャンプし)途中の行から実行はどのような命令
与えると実現できるでしょうか。
宜しくお願いします。

Aベストアンサー

> 途中から実行というのは最初から検証すると時間かかるので
> 問題の動きがある場所だけ修正したいのですけど

単純にすっ飛ばせればそれでいいって話だったら、これで一発。

実行したい処理

While False
 実行したくない処理
   :
 実行したくない処理
Wend

実行したい処理

要は、実行したくない処理を絶対に成立しないループで囲っちゃえ、という作戦です。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング