UWSC 掲 示 板
投稿時に「証明書が不正です」と出る場合には、JavaScriptをオンにしてください
動作不具合での質問の場合には環境(OS,IEのバージョン等)の表記もしてください
タイトルは質問内容を表したものにしてください
ネットゲーム関係の質問はご遠慮ください

複数のTHREADの処理が終わってから次を実行したい / moco
処理Aが全て終わってから処理Bを実行したいです
方法ありますでしょうか


//処理A
FOR A = 5 TO 0 STEP -1
THREAD tes
SLEEP(1)
NEXT

//処理B
FOR B = 5 TO 0 STEP -1
FUKIDASI("処理Bあと" + B + "秒",100,100,0,40)
SLEEP(1)
NEXT

Procedure tes
FOR A = RANDOM(2) + 4 TO 0 STEP -1
FUKIDASI("処理Aあと" + A + "秒",G_MOUSE_X,G_MOUSE_Y+A*100,0,40)
SLEEP(1)
NEXT
Fend

No.5021 2018/01/19(Fri) 14:38:17

Re: 複数のTHREADの処理が終わってから次を実行したい / stuncloud
const A_MAX = 5
public flg[A_MAX]
setclear(flg, 0)

for A = A_MAX to 0 step -1
 thread tes(A)
 sleep(1)
next

repeat
 sleep(0.1)
until calcarray(flg, CALC_ADD) = length(flg)

msgbox("スレッドが全て終わりました")

procedure tes(i)
 // 処理
 flg[i] = 1
fend


フラグ用の配列を準備しておき、スレッドで呼ばれる関数が終了したら配列に1を書き込むようにします
スレッドで呼び出すときにインデックス番号も渡しておくことでそれぞれ重複することなく別の要素に書き込みます
配列内のすべての要素が1になったら待機ループを抜けます

No.5023 2018/01/19(Fri) 15:03:09

Re: 複数のTHREADの処理が終わってから次を実行したい / moco
ありがとうございます
変動する文(ここでは「あいさつ」)の中から配列の中にある文字と一致した時にthreadを実行させる場合だとどうなるでしょうか
"あ"と"い"が一致するのでkを2にしたいのですがこれだと変数Kが定義されていませんと出てきます


Public moj[] = "あ","い","う","え","お"
bun = "あいさつ"
k=0

for A = 0 to (LENGTH(moj)-1)
 ifb POS(moj[A],bun)>0
  k=k+1
 endif
 Public flg[k]
next

for A = 0 to (LENGTH(moj)-1)
 ifb POS(moj[A],bun)>0
  thread tes(A)
  sleep(1)
 endif
next

repeat
 sleep(0.1)
until calcarray(flg, CALC_ADD) = length(flg)-1

msgbox("スレッドが全て終わりました")

procedure tes(i)
//処理A
 flg[i] = 1
fend

No.5026 2018/01/19(Fri) 20:07:45

Re: 複数のTHREADの処理が終わってから次を実行したい / トンボ
UWSCヘルプの<変数>の説明に下記1行がありました。
※ 注:PUBLIC変数の初期化はスクリプト実行前に行われます。

下記の実装だと、スクリプト実行直前にPublicのflgが先に実体を持ちますが、この時点ではkはまだ存在しないので、「変数Kが定義されていません」になります。
k=0 // ←Publicが無ければDim扱いになります
Public flg[k]

解決策はお分かりになると思いますが、「PUBLIC k = 0」とするか、「Dim flg[k]」にするかです。

No.5027 2018/01/19(Fri) 21:24:35

Re: 複数のTHREADの処理が終わってから次を実行したい / トンボ
上記のエラーを解決しても別のエラーが出ますので、修正しました。
もし問題があれば、スクリプト修正または指摘してください。

public moj[] = "あ","い","う","え","お"
bun = "あいさつ"

public flg[]
k = 0

// 文字列一致の数を取得する
for A = 0 to (LENGTH(moj) - 1)
 ifb POS(moj[A], bun) > 0
  k = k + 1
 endif
next

// 配列のサイズを変更
resize(flg, k - 1)

// 文字列一致の数だけthread処理Aを実行
for A = 0 to k - 1
 print (A + 1) + "つ目の処理Aの実行" // ←この行は削除可
 thread tes(A)
next

repeat
 sleep(0.1)
 print join(flg, " ") // ←この行は削除可
until calcarray(flg, CALC_ADD) = length(flg)

msgbox("スレッドが全て終わりました")

// 処理A
procedure tes(i)
 sleep(1 * i) // ←この行は削除可
 flg[i] = 1
fend

No.5029 2018/01/19(Fri) 23:16:02
スクレイピングが出来ない部分は…? / ある
情報の抽出がうまくいかないのですが、どうしたらちゃんと取れるでしょうか?

下記スクリプトを実行して、クリップボードのデータをテキストに張り付けた状態で
「中国风红木企业私人定制刻字LOGO」を検索してもヒットしませんでした。
getelementsbytagnameで要素ごとに調べてみてもダメでした。
そもそも構造的に取得不可能なものなんでしょうか?

もし何かやり方があるのでしたらヒントだけでも頂けたらと思います。

//--------------------------------------
Public IE
IE = CreateOLEObj("InternetExplorer.Application")
IE.Visible = True
setOleEvent()
IE.Navigate("https://s.taobao.com/search?imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id=staobaoz_20180116&ie=utf8&tfsid=TB1WUesnnnI8KJjy0FfXXcdoVXa&app=imgsearch")
BusyWait()

body=IEgetsrc(IE,"body")
sendstr(0,body)

No.4996 2018/01/17(Wed) 00:40:33

Re: スクレイピングが出来ない部分は…? / ある
Busywait()はRecIEで生成されたものを使用しています。
(長いため省略しています)

No.4997 2018/01/17(Wed) 00:41:54

Re: スクレイピングが出来ない部分は…? / トンボ
IEウィンドウのDOM Explorerのテキストと照合した結果、下記1行のテキストを見つけました。
<div class="loading">加载中...</div>

予想ですが、IE内容の更新が完了する前にテキスト取得したのがNGではないでしょうか。
(つまり取得タイミングが問題。)

ただ、私はIEのCOMオブジェクトに詳しくはないため、これ以上のアドバイスはできず…。

No.5007 2018/01/17(Wed) 22:11:29

Re: スクレイピングが出来ない部分は…? / stuncloud
HTML自体のレンダリングが終わってもその後jsで動的にdocumentが書き換わるパターンだとBusyWait()だけでは対応できません
なので、描画が完全に終わりつつある・終わった場合に存在するエレメントを予め調べておき、それが出てくるまで待つというような方法を取ります
対象エレメントのidがわかってる場合ならば、例えば

function WaitElementById(IE, id, timeout = 10)
 t = gettime() + timeout
 repeat
  e = IE.document.getElementById(id)
  if e = NOTHING then
   sleep(0.1)
  else
   result = e
   exit
  endif
 until gettime() >= t
 result = NOTHING
fend

こんな感じのものをBusywait()の後に呼びます
対象エレメントが出現した時点でそのオブジェクトを返すようになっています
見つからない場合はNOTHINGが返るのでその場合はループするという仕組みですね
あと念のためタイムアウト秒を指定できるようにしています

No.5022 2018/01/19(Fri) 14:47:16
最前面にポップの指定テキストエリアに指定文字列を入力させる方法 / 遊助
ワードプレス内で「サムネイル画像を設定」のリンクをクリックすると最前面にポップのようなモノが表示されます。
タイトルと代替テキストのテキストエリアに指定の文字列を入力させる方法ないでしょうか?

下記がその画像です。
https://gyazo.com/171a2349c5d8a3885e15d2f1ffa08849

No.5013 2018/01/18(Thu) 17:14:48

Re: 最前面にポップの指定テキストエリアに指定文字列を入力させる方法 / トンボ
UWSCの高レベル記録やショートカットキー入力(KBD関数やSCKEY関数)でもNGでしょうか。
もしNGでしたら、下記案もあります。
?@「代替テキスト [ ]」の部分をイメージファイル(**.bmp)として作成し、CHKIMG関数を利用して座標取得する(G_IMG_X、G_IMG_Y)。
?ABTN関数で指定の座標にマウスクリックする。
?BSENDSTR関数やKBD関数などで指定文字列を入力する。

No.5016 2018/01/19(Fri) 07:35:14
ワードプレス内に画像をドラッグ&ドロップする方法 / 遊助
指定フォルダーにある1つの画像をワードプレスの個別記事の画像設定にドラッグ&ドロップする為に下記を試しても一瞬ドラッグ&ドロップするのですがアップロードせずに反応しない状態です。何か良い方法ないでしょうか?

指定フォルダー="C:\Users\gazou"
getdir(指定フォルダー)
id99=GETID("投稿の編集 WordPress - Internet Explorer","IEFrame")
dropfile(id99 , 指定フォルダー , GETDIR_FILES[0])

No.5012 2018/01/18(Thu) 16:51:37

Re: ワードプレス内に画像をドラッグ&ドロップする方法 / トンボ
サンプルになりますが、ウィンドウは手動ではなくUWSCから表示すれば、とりあえず動く模様です。
(EXEC()を削除してペイントツールを手動で開いて試すと、同ツールからエラーが表示され、NGでした…。)

EXEC("mspaint") // EXEC()でペイントツール表示
DROPFILE(GETID("ペイント"), "C:\Temp", "abc.bmp")

EXEC()の使用だと都合が悪い場合は、No.4280の記事にあるスクリプトを参考に試してください。
本掲示板の最下にある記事検索にて「dropfile」を入力して[Search]すれば、すぐに見つかります。

No.5014 2018/01/18(Thu) 21:27:09
条件式にクリップボードの文章の文字列が変わったらの式 / ユウナ
if条件式にクリップボードの文章の文字列が変わったらのコードってどう書けばいいでしょうか?
No.4982 2018/01/14(Sun) 22:03:51

Re: 条件式にクリップボードの文章の文字列が変わったらの式 / satocha
getstr(0)で現在クリップボードにある文字列を取得し、以前に取得していた文字列と比較すればいいです。
CurrentClipStr=getstr(0)
if CurrentClipStr <> OldClipStr
 //クリップボードの文章の文字列が変わったときの処理
endif

No.4983 2018/01/15(Mon) 07:42:50

Re: 条件式にクリップボードの文章の文字列が変わったらの式 / ユウナ
satocha様、期待どおりの処理ができました。ありがとうございます。
No.5011 2018/01/18(Thu) 11:12:30
下のキーを繰り返しで順次増やして押していく方法 / ハルヒ
for文で例えば3回、回していくとして、1回目は下キーを一回、2回目は下キーを2回入力と順次増やしていく方法ないでしょうか?
No.4980 2018/01/14(Sun) 19:41:15

Re: 下のキーを繰り返しで順次増やして押していく方法 / satocha
For文を入れ子にすれば可能です。
No.4985 2018/01/15(Mon) 07:49:19

Re: 下のキーを繰り返しで順次増やして押していく方法 / トンボ
簡潔に言うとFor文の中にFor文って感じですね。
FOR i = 1 TO 3
FOR j = 1 TO i
PRINT i + "巡目:" + j + "回目のキー押下"
KBD(VK_DOWN, CLICK, 1000)
NEXT
NEXT

No.4995 2018/01/16(Tue) 23:45:20

Re: 下のキーを繰り返しで順次増やして押していく方法 / ハルヒ
トンボ 様、回答ありがとうございます。
for文の入れ子でできるとは考えつかなかったです。
たすかりました。

No.5010 2018/01/18(Thu) 11:11:35
Thunderbirdでメールを送信時に指定差出人と送信ボタンを押す方法 / 遊助
Thunderbirdでメールを送信する時に差出人のメールアドレスの1つ目をクリックして送信を押して、次に差出人のメールアドレスの2つ目を選択して送信する方法が分かりません。何かよい方法ないでしょうか?

下記が画像です。
https://gyazo.com/424c4dedbe999b8ec35279bdb78a31ff

No.4973 2018/01/13(Sat) 01:00:32

Re: Thunderbirdでメールを送信時に指定差出人と送信ボタンを押す方法 / トンボ
Thunderbirdの使い方がよくわかりませんが、キー入力で色々試すと良いです。

アドレスの選択方法ですが、クリック処理だとThunderbirdが無くて試せない上、
ちょっと面倒な処理になる気がしますので、文字列の直接入力方法にしました。

スクリプトを記述しますが、どこか間違っていたらごめんなさい。

// ウィンドウのID取得とアクティブ化
WinId = GETID("作成: (件名なし)")
ACW(WinId)

// [ALT]+[R]キー押下で[差出人]欄に移動
KBD(VK_ALT, DOWN, 1000)
KBD(VK_R, CLICK, 1000)
KBD(VK_ALT, UP, 1000)

// [TAB]キー2回押下で[宛先]の入力欄に移動 ←押下は1回だけでいいかも?
KBD(VK_TAB,CLICK, 1000)
KBD(VK_TAB,CLICK, 1000)

// 1つ目のアドレスを入力して[Enter]キー押下でアドレス決定 ←多分次の行へ移動する?
SENDSTR(WinId, "yrimys1u@")
KBD(VK_RETURN, CLICK, 1000)

// ←ここにも[TAB]キー押下処理が必要?

// 2つ目のアドレスを入力して[Enter]キー押下でアドレス決定 ←多分次の行へ移動する?
SENDSTR(WinId, "acaio59c@")
KBD(VK_RETURN, CLICK, 1000)

No.4998 2018/01/17(Wed) 00:44:15

Re: Thunderbirdでメールを送信時に指定差出人と送信ボタンを押す方法 / トンボ
追伸。
送信ボタン押下処理はショートカットキーがわからないため、KBD関数、SCKEY関数、CLIKITEM関数のどれかで試してください。

なお、Outlookを元に予想でスクリプト作成しましたが、動くと良いですね。

No.5000 2018/01/17(Wed) 07:50:24

Re: Thunderbirdでメールを送信時に指定差出人と送信ボタンを押す方法 / 遊助
トンボ様返信ありがとうございます。
希望どおりの処理ができました。

No.5009 2018/01/18(Thu) 11:10:29
特定のFOLDERが閉じるまで待つ方法は(せき) / せきこうじ
●画像解析ソフトの自動化を進めています。
解析ソフトの親ウインドがあり、ある動作開始後はその上に小さな子ウインドが現れ、35分くらいすると子ウインドが閉じます(時間は一定しない)。閉じたことを確認後に次の動作をしたいのです。
=====
知恵袋の回答をみると
id=GETID("ウインドタイトル名")
WHILE(STATUS(id,ST_TITLE)<>"")
SLEEP(0.01)
WEND
=====
で実現するとの答えを見つけました。
上記記載で<>の意味がよくわかりません。
”ウインドタイトルが取得できなくなるまでまつ”
ということでしょうか。

またほかのよい方法はありますでしょうか。

No.5001 2018/01/17(Wed) 10:53:45

Re: 特定のFOLDERが閉じるまで待つ方法は(せき) / satocha
>上記記載で<>の意味がよくわかりません

「A <> B」で「AとBが等しくない」という意味です。
知恵袋の回答者がどういう意図でコーディングしたか知りませんが、

>WHILE(STATUS(id,ST_TITLE)<>"")

は「ウインドウのタイトル文字列が空文字列でない間は」という意味です。ウインドウが閉じられれば、タイトル文字列も取得できなくなりますから、ほぼ「ウインドウの開いている間は」と同じ意味になります。

「ほぼ」と断り書きを入れたのは、世の中のウインドウすべてが必ずしもタイトル文字列を持っているわけではないからで、そういうウインドウの挙動をこのプログラムで知ることはできません。

UWSCのstatus関数には、ウインドウの存否を知る機能もあります。ヘルプで確認してほしいのですが、

status(id,st_isid)

がそれです。せっかく機能が用意されているのですから、こちらを使ったほうがいいと思います。

No.5004 2018/01/17(Wed) 15:57:04

Re: 特定のFOLDERが閉じるまで待つ方法は(せき) / トンボ
<>は比較演算子の1つですね。
「比較演算子」でググれば参考情報が色々出ますので、他の演算子も学べます。

OPTION SAMESTR // 「文字比較、置換、サーチにて大文字、小文字を区別」を有りにする
PRINT "a" <> "b" // (不一致なので)True
PRINT "A" <> "a" // (不一致なので)True
PRINT "a" <> "a" // (不一致ではないので)False

>またほかのよい方法はありますでしょうか。
REPREAT文でもいけます。加えてウィンドウが開いたか確認する処理も作成しました。

// ウィンドウが開くまでループ
REPEAT
id = GETID("タイトル")
SLEEP(1)
UNTIL id <> -1
PRINT "ウィンドウが開いた"

// ウィンドウが閉じるまでループ
REPEAT
SLEEP(1)
UNTIL STATUS(id, ST_ISID) = False // ←※
PRINT "ウィンドウが閉じた"

※?@目的は、タイトル内容ではなくウィンドウ開閉状況の確認なので、ST_ISIDが良いですね。
 ?AGETID関数を使わないのは、ウィンドウが多数表示されている場合に処理時間が長くなるため。
  STATUS関数はウィンドウへの確認が1つだけになるため、処理時間が短いです。

No.5006 2018/01/17(Wed) 21:15:02
WINDの終了問題は解決しました。 / せきこうじ
●いろいろありがとうございました。半日調べて自分で解決に至りました。
診療の合間にこっそり検索行っておりましたが、これでほぼ終了いたしました。

//BAADというウインドの状態を調べ、ACTIVEになったらACTIVEとプリントする。

WINID=GETID("BAAD ver.4.2.1.0")

REPEAT
SLEEP(5)
PRINT "STATUS(ST_ACTIVE)=["+STATUS(WINID,ST_ACTIVE)+"]"
SLEEP(5)
UNTIL STATUS(WINID,ST_ACTIVE)


PRINT "BAAD=ACTIVE"
SLEEP(5)

●実際はPRINTではなく次の動作です。

No.5005 2018/01/17(Wed) 16:08:44
Win 10 IE で MMV による縦スクロールができなくなりました / こがっく
週末の Windows アップデートの後からだと思いますが
Win 10 IE でマウスエミュレーションによる縦スクロールが
できなくなりました。簡単な回避方法はありませんでしょうか。
以下 IE で Yahoo! のトップページが開いているという前提
で再現確認用の決め打ちスクリプトです。

wi = GETID("Yahoo! JAPAN - Internet Explorer",,0.01)
if wi >= 0
ACW(wi,0,0,800,760)
SLEEP(1)
MMV(790,180)
SLEEP(1)
BTN(LEFT,DOWN)
SLEEP(1)
MMV(790,380)
SLEEP(1)
BTN(LEFT,UP)
endif

No.4990 2018/01/16(Tue) 03:44:27

Re: Win 10 IE で MMV による縦スクロールができなくなりました / リキュール
MMV(790,180)
SLEEP(1) → SLEEP(100)
にしてマウスカーソルが目的のバーにあるか確認してみてはどうですか。

No.4991 2018/01/16(Tue) 15:58:09

Re: Win 10 IE で MMV による縦スクロールができなくなりました / satocha
バージョンアップに伴って起動時のIEのサイズやウインドウの位置がかわったのかもしれませんね。

ブラウザのスクロールバーをつかんで上げ下げしているようですが、それだと、今後もちょっとしたことで動かなくなるような気がします。
mouseorgでウインドウ座標を設定し、status関数で幅や高さを取り出して調整すればサイズ変更に対応できるでしょうが、試行錯誤が必要です。

それより、マウスホイールをエミュレーションすれば、IE以外のブラウザでもいけるのでは?
BTN(wheel,±500)みたいな感じでしょうか。

No.4992 2018/01/16(Tue) 16:15:38

Re: Win 10 IE で MMV による縦スクロールができなくなりました / こがっく
さっそくのコメントありがとうございます。

MMV の座標はあくまでも例です。再現させていただく場合には、メニューバー
等の表示いかんによってスライダーの位置が変わるので MMV の座標を変更
していただく必要があります。

SLEEP(1) でもマウスカーソルがスクロールバーのスライダー上にあることは
確認できます。また BTN(LEFT,DOWN) や BTN(LEFT,UP)でスライダーの色が
変わるので BTN(LEFT,DOWN) まで動作していることも確認できます。
2回目の MMV でスライダーが動いてくれないのです。
SLEEP の秒数を増やしても問題現象は変わりません。
さらに、先週まで(Windows Update がかかるまで)はスライダーは確実に
動いてくれていたのです。

ちなみに、MMV を使わないでスクロールバを BTN(LEFT,CLICK)
したり、BTN(wheel,-1)、KB_DOWN でのスクロールは今でも
ちゃんと動くのですが、これらの方法は荒っぽくしか調整でき
ないのでうまくありません。

No.4993 2018/01/16(Tue) 22:52:28

Re: Win 10 IE で MMV による縦スクロールができなくなりました / こがっく
すみません typo がありました。
誤:KB_DOWN
正:VK_DOWN

No.4994 2018/01/16(Tue) 23:03:46

Re: Win 10 IE で MMV による縦スクロールができなくなりました / こがっく
追加情報です
以下の ようにして、SLEEP(10) で 10秒待っている間に手でマウスを上下左右どの方向にでもほんの少しでも動かすと、スライダーが本来期待している場所にピョンと動きます。
IE が2個めの MMV で不足の何らかのイベントを期待しているようです。

// 再現テストをする場合は最初の MMV の 180 はスライダーの上になるように直してください。
wi = GETID("Yahoo! JAPAN - Internet Explorer",,0.01)
if wi >= 0
ACW(wi,0,0,800,760)
SLEEP(1)
MMV(790,180)
SLEEP(1)
BTN(LEFT,DOWN)
SLEEP(1)
MMV(790,380)
SLEEP(10)
BTN(LEFT,UP)
endif

No.5002 2018/01/17(Wed) 13:59:23

Re: Win 10 IE で MMV による縦スクロールができなくなりました / こがっく
IE に気付かせれば良いのかと以下のように左ボタンを離す前に右クリックを1発入れたら対策になりました。
同様のお悩みを持たれた方へのご参考まで。
#なお、すべての SLEEP(1) は動きをみるため、わざとゆっくり動作させるように入れてあるものです。

wi = GETID("Yahoo! JAPAN - Internet Explorer",,0.01)
if wi >= 0
ACW(wi,0,0,800,760)
SLEEP(1)
KBD(VK_HOME,CLICK)
SLEEP(1)
MMV(790,180)
SLEEP(1)
BTN(LEFT,DOWN)
SLEEP(1)
MMV(790,380)
SLEEP(1)
BTN(RIGHT,CLICK)
SLEEP(1)
BTN(LEFT,UP)
endif

No.5003 2018/01/17(Wed) 14:26:22


 過去ログ(〜2017/08/24)・検索ツール


以下のフォームに記事No.と投稿時のパスワードを入力すれば
投稿後に記事の編集や削除が行えます。
199/200件 [ ページ : << 1 ... 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 >> | 過去ログ ]