自動化ツールuwsc使いよ集まれ5
at SOFTWARE
1:名無しさん@お腹いっぱい。
09/12/09 05:27:33 J1DL1P1U0
Windowsを自動化させるツールUWSC。
URLリンク(www.uwsc.info)
uwsc使いのみなさま、マターリ己のスクリプトを晒しましょ。
2:名無しさん@お腹いっぱい。
09/12/09 05:28:50 J1DL1P1U0
●質問したい方へ。
「○○作れますか?」→ スクリプトを期待するのはお門違い。作れるか作れないか教えてくれる人はいるかも。
「○○が作りたい」→ 自分作ればいいんじゃない?
「○○作って下さい」→ 依頼スレじゃありません。
過去ログを見る、検索する等、自分で出来る事を書き込む前にするように。
自力で作ったのを晒すか、具体的な解らない場所を提示して、改善点や解決策を求めるようにしましょう。
●スクリプトを晒す上での注意
他人が読みやすいようにインデントを付けるように。解らない人はググレ。
(タブインデントは使えないんだぜ 全角スペース等に 変換しておくべし)
言いたい事に関係無い部分は 〜○○の処理〜 や 処理A 等のようにし、
必要な部分を晒すようにする。
●他人の書いたスクリプトを安易に実行しないように。
ハードディスクをフォーマットされたりしても、自己責任。
前スレ
自動化ツールuwsc使いよ集まれ4
スレリンク(software板)
3:名無しさん@お腹いっぱい。
09/12/09 06:14:55 J1DL1P1U0
UWSCスクリプトの解説(初歩の初歩)
URLリンク(big.tm.land.to)
UWSCで自動化 超速!! Windows マクロテクニック
URLリンク(izagne.com)
4:名無しさん@お腹いっぱい。
09/12/09 06:19:43 J1DL1P1U0
解決マクロマン
URLリンク(blog.livedoor.jp)
SCRIPTS
URLリンク(scripts.web.fc2.com)
UWSCサンプル集
URLリンク(www.nagomi-jp.net)
UWSCの誘惑
URLリンク(nem.symphonic-net.com)
UWSCの落し物部屋
URLリンク(siromasa.xxxxxxxx.jp)
5:名無しさん@お腹いっぱい。
09/12/09 19:49:51 wIUeYzw+0
どなたか、教えていただけませんでしょうか?
URLリンク(oshiete1.goo.ne.jp)
UWSCはまだマイナーなんでしょうか?
↑では誰も回答してくれません。
この板で質問したほうがよかったかなと後悔。。。
6:名無しさん@お腹いっぱい。
09/12/09 20:40:08 OlCmmWUF0
>>5
まだ前スレが埋まってないよ?
それに、そっちで質問してるんだったら、一日くらいは待とうぜ?
そのソフトを使ったこと無いから解らんが、
>"winLirc.exe"が準備するキー情報
これはどこに準備されるのか不明なの?
外部プログラムのメモリ読み出すDLLとか使って、準備するキー情報とやらを読み出すか、
ソースに付け加えて赤外線認識時に何か動作させるか、そういう事すればいいんじゃね?
7:名無しさん@お腹いっぱい。
09/12/09 21:28:44 q5sTIjr10
そんな丸投げな質問の仕方ならレスつかなくて当然
8:名無しさん@お腹いっぱい。
09/12/09 21:57:28 8TzPg+9x0
>>5
UWSCもユーザー多いかどうか分からないけど、
それ以上に赤外線リモコン使ってる人が少ないでしょう。
確かにUWSCの起動は遅いので、一瞬で起動して操作するということはできません。
exe化することで少々反応は早くなるかもしれませんが、どれほど効果があるか分かりません。
試用版でDOSコマンドを実行するものをexe化してみましたが、微妙に反応がいい気はします。
効果がありそうな方法は、あらかじめUWSCを起動しておくことですね。
昔よくあったんですよ。
一太郎とかエディタとかをすばやく起動するために、タスクアイコンとして常駐しておくという方法が。
UWSCはそのまま起動すると画面が邪魔だから、1ヶ月くらいSleepするスクリプトを起動しておけばいいんじゃないでしょうか。
とりあえず今やってみたところ・・・変りないですね。
一番いい方法は、常駐しているUWSCにコマンドオプションが送られてそのまま処理するというものですが、
同じスクリプトファイルでも新規に起動してしまうし、UWSCは外部からの呼び出しができない仕様になっているので無理ですね。
DOSのバッチファイルを起動するのはとても早いんですよ。
DOSだけでやれればそれでいいと思います。
9:名無しさん@お腹いっぱい。
09/12/09 22:51:53 8TzPg+9x0
>>5
けど、UWSCを使いたければ、こういう方法があります。
1.UWSCのループでクリップボードを監視
2.DOSでクリップボードにコマンド発行
3.コマンドの種類ごとに機能を実行
この方法ならコンスタントに、DOSコマンド実行(0.1秒)+UWSCのSleep時間(0.1秒)で0.2秒後にはコマンドを実行できるでしょう。
このコマンドを使います。
URLリンク(www.vector.co.jp)
UWSCを呼ぶ代わりに.batファイルを登録します。
-- click.bat ここから--
rem こんな感じで
echo "コマンド実行-A" > clip
-- click.bat ここまで--
-- リモコン.uws ここから最後まで--
while true
cl = getstr(0)
ifb 1 = pos( "コマンド実行", cl ) then
sendstr(0,"") // 使ったら空にしないと永久ループになる
select cl
case "コマンド実行-A"
KBD(VK_A)
default
sendstr(0, cl) // コマンドがなかったから元に戻す
selend
endif
sleep(0.1)
wend
10:名無しさん@お腹いっぱい。
09/12/09 23:43:52 wIUeYzw+0
>>6-9
回答ありがとうございました。
11:名無しさん@お腹いっぱい。
09/12/09 23:47:54 JwROkqhK0
>>8
ちとツッコミ。
>exe化することで少々反応は早くなるかもしれません
コンパイルしている訳ではありませんので スピードが速くなる事はありません。
サイズもUWSC本体と同程度になります。
※ UPX等を使えばサイズは3分の1程になります(UWSC本体の圧縮は厳禁)
by umiumi
>確かにUWSCの起動は遅い
関連づけしておけば起動速度自体は特に気にならないような…
計算処理が (たとえi=i+1だけでも)あると速度的に相当見劣りするのは確かだけど。
12:名無しさん@お腹いっぱい。
09/12/09 23:55:55 wIUeYzw+0
>>9
ありがとうございます。
DOSのバッチファイルということで、clip.exeをちょっと実験してみました。
なんせ、DOSコマンドはdir、copy、path、mkdirぐらいしか使ったことがありませんし(そもそもプログラミング自体、大昔にアセンブラをいじった程度です)
ご教授頂いただいたことは、(あくまで私の解釈ですので間違っていたらご指摘ください)DOSコマンドでWinLirc.exeのデータを取得してクリップボードにコピー、
それをUWSCで扱う・・・ということだと理解しました。
残念ながら、clip.exeの動作は理解したのですが、DOSコマンドを使っていかにwinlirc.exeから情報を得るのかがわかりません。
許せるならば、貴殿の知識をもう少しお分けいただければと思います。お願いします。
13:名無しさん@お腹いっぱい。
09/12/09 23:58:15 8TzPg+9x0
前スレで出てたAutoHotKeyだとWindowsアプリのようにメッセージを受け取って処理できるんですよね。
バッチファイルでSendMessageできれば待ちループもなくて平均0.5秒始動が早くなると思って探してみました。
@はOLEオブジェクトなのできっと遅いです。
AはSendMessageというDOSコマンドを自作しているっぽいですが、肝心のコマンドが見つかりませんでした。
BはMessengerサービスを開始してファイアーウォールも無効にして試したけどうまくいかなかった。
@ URLリンク(plaza.rakuten.co.jp)
> コマンドプロンプトから直接Win32API [ シェル ]
> コマンドプロンプトから直接Win32APIを呼び出してみました。
> 実際は、MSHTA->VBScript->Excel->Excel4.0マクロなんだけど。
> C:\borland>mshta vbscript:execute("Set a=CreateObject(""Excel.Application""):a.ExecuteExcel4Macro(""CALL(""""user32"""",""""MessageBoxA"""",""""JJCCJ"""",0,""""Hello, World"""",""""TEST"""",0)""):close()")
>
> C:\borland>
>
> ダブルクォーテーションが多いので入力するときに大変・・・・
> (改行されているのはブラウザのせいなので、そこはよろしくです)
A URLリンク(www.hm2.aitai.ne.jp)
:/マシンファイルの設定
> SENDMESSAGE "$%HANDL%" WM_CHAR '1'
> SENDMESSAGE "$%HANDL%" WM_CHAR VK_RETURN
> STR LEN %MFILE%
> FOR /L %%A IN (1 1 %ERRORLEVEL%) DO
> STR MID B %MFILE% %%A 1
> SENDMESSAGE "$%HANDL%" WM_CHAR '%B%'
> ENDFOR
> SENDMESSAGE "$%HANDL%" WM_CHAR VK_RETURN
B バッチファイルでこんなコマンドを実行。でもかなり面倒な上にセキュリティもなくなる。
net send localhost メッセージ
14:名無しさん@お腹いっぱい。
09/12/10 00:37:38 AMT7Pyke0
>>12
> DOSコマンドを使っていかにwinlirc.exeから情報を得るのか
RC01 POWER exe で実行ファイルが指定できると思います。
もし拡張子batファイルを指定可能なら、>>9に書いた click.bat を指定します。
click.batに記述されたコマンドでクリップボードに文字列をセットし、
UWSCがその文字列を受け取ったら処理を開始します。
クリップボードはいろいろな文字列が入ってくるので、誤作動しないように固有の文字列を作る必要があります。
パスの設定が必要になると面倒なので、 clip.exeはWindowsフォルダにコピーした方がいいでしょう。
本当はセットで使うので同じフォルダに置いて echo "コマンド実行-A" > %~dp0clip.exe とかしたほうがいいんでしょうけど。
>>11
まあそうかもしれませんが、batファイルの呼び出しと比較したらやっぱり雲泥の差になりますから。
>>5さんがどこまでの反応速度を求めているのか分かりませんが、
たとえばテレビのチャンネルを変えるだとかブラウザでスクロールするとかの場合にはそれなりの反応速度を期待すると思います。
また、繰り返し実行するものの場合は起動から終了までの通しでの時間が重要になるし、
ゼロに近づける方法はやっぱり重要だと思います。
15:名無しさん@お腹いっぱい。
09/12/10 22:32:15 +EDF+/cG0
>>14
こんばんは、12です。ご説明、よくわかりました。
早速、作ってみました。
もう、完璧です!
マシーンの動作ってこうでなくっちゃ、という感覚です。
UWSCも>>9にちょっと手を加えただけで完成です。
(DOSのechoコマンドがスペースとCRLFを引き連れてやってくるところはてこずりました。)
重ねてお礼申し上げます。ありがとうございました。
ついでといっては、なんですが、
>>8
>UWSCはそのまま起動すると画面が邪魔だから、1ヶ月くらいSleepするスクリプトを起動しておけばいいんじゃないでしょうか。
ここの部分を詳しく教えていただければと思います。
SLEEPだけのスクリプトを動かしておけば、他のは隠れて動く、ということなのでしょうか?
これも、実験してみます。
16:名無しさん@お腹いっぱい。
09/12/10 23:49:40 AMT7Pyke0
>>15
余分なものが入ってましたか。気がつきませんでした。
> ここの部分を詳しく教えていただければと思います。
サクラエディタとかの常駐型アプリを使ってみると分かりますが、一旦起動したらメモリ上に残るので、
以降のファイルを開く動作が非常に速くなります。
UWSCも同じように、一つ常駐させればスクリプトの読み込みが早くなるかなと思ったんですが、
UWSCは別プロセスで起動するのでそうはならないようでした。
常駐させる方法として次の1行を実行させる方法を提案しました。
スクリプトファイルを直接実行すれば、UWSCのメイン画面は表示されないので。
sleep(60*60*24*30) // これで1ヶ月スリープ
「画面が邪魔」というのは、UWSCの画面は最前面に表示されるので、常時起動しているとしたら邪魔ですよね?
スクリプトファイルの関連付けで起動することで、メイン画面は非表示になるのを利用しようというわけです。
17:名無しさん@お腹いっぱい。
09/12/11 00:03:06 TAkxOJ9A0
大文字小文字にこだわりのあるおにーさんたちはどう書いてるの?(´・ω・`)
CREATEOLEOBJ
CreateOLEObj
CreateOleObj
Createoleobj
18:名無しさん@お腹いっぱい。
09/12/11 00:12:03 bDw5dpFU0
CreateOLEObj
なんとなく、クセかなぁ。
全部大文字とか全部小文字はなんとなくぱっと見で読み辛い気がするね。
ちょっと前流行った日本語の文字の場所を入れ替えるどうのこうののコピペじゃないけど、
英語でも頭文字の部分が強調されていれば、感覚的に解る感じがするからなー。
19:名無しさん@お腹いっぱい。
09/12/11 00:53:34 3W3bqgjj0
CreateOLEobj
objは小文字で書いちゃうなぁ。
objIEとかで探すとそういう書き方が多かったもんで。
20:名無しさん@お腹いっぱい。
09/12/11 01:27:12 Zaw60Q490
CREATEOLEOBJ
理由:単語辞書の登録がたまたまそうなってから…
21:名無しさん@お腹いっぱい。
09/12/11 01:40:56 ex5DG+cq0
空白にこだわりのあるおにーさんたちはどう書いてるの?(´・ω・`)
For i = 0 to 10 - 1
For i=0 to 10 -1
For i=0 to 10-1
GetID( Title, Class)
GetID(Title, Class)
GetID(Title,Class)
22:名無しさん@お腹いっぱい。
09/12/11 01:57:52 mXLjG1QG0
For i = 0 to 10 - 1
GetID(Title, Class)
23:名無しさん@お腹いっぱい。
09/12/11 02:02:40 yv164UXr0
有料でいいから文法をjavascript仕様にしたものを出してくれないかな。需要はあると思うんだけど。
24:名無しさん@お腹いっぱい。
09/12/11 02:25:02 ASOL9Pzm0
c系統に慣れているから
while wend とか ifb endif とかになれるのはつらかったけど、慣れるとそれなりにいい^^
25:名無しさん@お腹いっぱい。
09/12/11 04:22:04 iOSKkb9p0
FOR I = 0 TO (10 - 1)
26:名無しさん@お腹いっぱい。
09/12/11 11:03:24 Vw07lAHm0
CreateOLEobj
IESetData( IE, text, "MESSAGE" )
IE.document.all.submit.click()
REPEAT; sleep(0.1); UNTIL !IE.busy AND IE.readystate = 4
for i = 0 to 10 - 1
while true
GetID( Title, Class )
GetID(Title)
まあキーワードに色付けてるから大文字の方が目立って見やすかったりする。
27:名無しさん@お腹いっぱい。
09/12/12 03:00:40 7cmFQzAf0
CLKITEMで項目を選択したいのだが項目名が変化する場合って
どうやって取得するんでしょうか
CLKITEM(id, "ダウンロード済 (X)", CLK_LSTVEW or CLK_LEFTCLK)
具体的には Xが変化するわけですが、Xのところに設定する
ワイルドカードみたいなのないんでしょうか
28:名無しさん@お腹いっぱい。
09/12/12 04:18:37 HwVuwznO0
CLK_SHORT
29:名無しさん@お腹いっぱい。
09/12/12 14:23:00 M7k2JrZE0
押されてるキーを全て取得する方法って無いかな?
GETKEYSTATE使うのは無謀すぎるし・・・
そういうスクリプトやDLLがあるなら教えてくれるとありがたい
30:名無しさん@お腹いっぱい。
09/12/12 15:07:15 TyWlORGEO
>>23
javascript仕様って何?
文法の話?標準関数とか?
31:27
09/12/12 15:29:54 7cmFQzAf0
>>28
できました
サンクスです
32:その1
09/12/12 17:11:47 HwVuwznO0
>>29
DEF_DLL GetKeyboardState({byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byt
e,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,by
te,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,b
yte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,
byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,
byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,
byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,
byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,
byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,
byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte,byte}): int: User32.dll
DIM key[256]
33:その2
09/12/12 17:14:29 HwVuwznO0
WHILE True
GetKeyboardState(key[0],key[1],key[2],key[3],key[4],key[5],key[6],key[7],key[8],key[9],key[10],key[11],key[12],key[13],key[14],key
[15],key[16],key[17],key[18],key[19],key[20],key[21],key[22],key[23],key[24],key[25],key[26],key[27],key[28],key[29],key[30],key[31],k
ey[32],key[33],key[34],key[35],key[36],key[37],key[38],key[39],key[40],key[41],key[42],key[43],key[44],key[45],key[46],key[47],key[48],
key[49],key[50],key[51],key[52],key[53],key[54],key[55],key[56],key[57],key[58],key[59],key[60],key[61],key[62],key[63],key[64],key[6
5],key[66],key[67],key[68],key[69],key[70],key[71],key[72],key[73],key[74],key[75],key[76],key[77],key[78],key[79],key[80],key[81],key
[82],key[83],key[84],key[85],key[86],key[87],key[88],key[89],key[90],key[91],key[92],key[93],key[94],key[95],key[96],key[97],key[98],k
ey[99],key[100],key[101],key[102],key[103],key[104],key[105],key[106],key[107],key[108],key[109],key[110],key[111],key[112],key[113],k
ey[114],key[115],key[116],key[117],key[118],key[119],key[120],key[121],key[122],key[123],key[124],key[125],key[126],key[127],key[128],
key[129],key[130],key[131],key[132],key[133],key[134],key[135],key[136],key[137],key[138],key[139],key[140],key[141],key[142],key[143],
key[144],key[145],key[146],key[147],key[148],key[149],key[150],key[151],key[152],key[153],key[154],key[155],key[156],key[157],key[158],
key[159],key[160],key[161],key[162],key[163],key[164],key[165],key[166],key[167],key[168],key[169],key[170],key[171],key[172],key[173],
34:その3
09/12/12 17:16:07 HwVuwznO0
key[174],key[175],key[176],key[177],key[178],key[179],key[180],key[181],key[182],key[183],key[184],key[185],key[186],key[187],key[188],
key[189],key[190],key[191],key[192],key[193],key[194],key[195],key[196],key[197],key[198],key[199],key[200],key[201],key[202],key[203],
key[204],key[205],key[206],key[207],key[208],key[209],key[210],key[211],key[212],key[213],key[214],key[215],key[216],key[217],key[218],
key[219],key[220],key[221],key[222],key[223],key[224],key[225],key[226],key[227],key[228],key[229],key[230],key[231],key[232],key[233],
key[234],key[235],key[236],key[237],key[238],key[239],key[240],key[241],key[242],key[243],key[244],key[245],key[246],key[247],key[248],
key[249],key[250],key[251],key[252],key[253],key[254],key[255])
FUKIDASI("VK_LEFT=" + ((key[VK_LEFT] AND $80) = $80) + " VK_RIGHT=" + ((key[VK_RIGHT] AND $80) = $80) + " VK_UP=" + ((key[VK_UP] A
ND $80) = $80) + " VK_DOWN=" + ((key[VK_DOWN] AND $80) = $80), 0, 0)
SLEEP(0.1)
WEND
35:名無しさん@お腹いっぱい。
09/12/12 17:22:27 3Ho66wEG0
>>32-33
BOOL GetKeyboardState(
PBYTE lpKeyState // 状態データの配列
);
dakara
DEF_DLL GetKeyboardState( byref byte[] ): Long: User32.dll
dim key[255]
ret = GetKeyboardState(key[])
for i = 0 to 255
print key[i]
next
36:35
09/12/12 17:37:15 3Ho66wEG0
ミスってた。
↓のコードで表示できたよ。3つまで同時表示。UWSCでもできるんだなあ。びっくり。
配列だと最初からポインタ渡しなんだな。
DEF_DLL GetKeyboardState( byte[] ): Long: User32.dll
dim key[255] // 0〜255で256個の配列
while true
ret = GetKeyboardState(key[])
FUKIDASI("VK_LEFT=" + ((key[VK_LEFT] AND $80) = $80) + " VK_RIGHT=" + ((key[VK_RIGHT] AND $80) = $80) + " VK_UP=" + ((key[VK_UP] AND $80) = $80) + " VK_DOWN=" + ((key[VK_DOWN] AND $80) = $80), 0, 0)
SLEEP(0.2)
wend
しかし、256個並べるわけにはいかないから、文字列連結が必要だろう。
256回のループはやっぱ必要か。
いや、共用体としてLong[64]を使えばループ回数は減らせるはずだ。
共用体が無理ならコピーでもいい。
37:35
09/12/12 19:03:03 3Ho66wEG0
なんか、キーを4つほど押したことになってるな・・・
んで普通に3つ押せる。
38:名無しさん@お腹いっぱい。
09/12/13 01:05:59 Znj2ND940
つ URLリンク(www3.bigcosmic.com)
つ URLリンク(www3.bigcosmic.com)
実用面では厳しいものがあると思うよ…。素直にAH(ry
39:35
09/12/13 11:16:19 C0QriWGM0
こんな感じでやればループ回数は1/4になるはずだけど、なんか失敗してるっぽい。
for j = i * 4 to j + 3 とかできちゃうのはUWSCの特徴。(やらない方がいいかも。)
普通なら for j = i * 4 to i * 4 + 3 って書かないといけない。
DEF_DLL GetKeyboardState( byte[] ): Long: User32.dll
DEF_DLL RtlMoveMemory( long[], byte[], Long ): Long: kernel32.dll
dim key[255]
dim array[63]
while true
s = ""
ret1 = GetKeyboardState(key[])
ret2 = RtlMoveMemory(array[], key[], length(key))
for i = 0 to 58 // arrayの場合
ifb array[i] and $80808080 then
print "i=" + i + "(" + array[i] + ")"
for j = i * 4 to j + 3
ifb key[i] and $80 then
s = s + "j=" + j + "(" + key[j] + ") "
endif
next
endif
next
FUKIDASI(s, 0, 0)
SLEEP(0.2)
wend
40:35
09/12/13 11:28:01 C0QriWGM0
UWSCで効率的にやろうと思ったら、DLL使って文字列化することだね。
そうすれば、同時に押せるキーは3つしかないわけだから、3回のループで済む。
key[255]を
keystatestring="00000000000000000000000000010010000000000000000" //256文字
for i = 1 to 3
POS( "1", keystatestring, i )
next
っていうか、keycoe[2]っていう配列にキーコードを返してくれるDLL関数があれば、その方がいいのか。
GetKeyboardState(keystate[])
for i = 0 to GetKeyCode(keycode[], keystate[])
ptint "keycode=" + keycode[i] + " keystate=" + keystate[keycode[i]]
next
41:名無しさん@お腹いっぱい。
09/12/14 17:44:27 9JPfc9vT0
ちょっと質問が
ウィンドウのないプロセスを終了させたいときはどうすればいいの?
具体的に言うとconime.exeをUWSCを使って終了させたいんだけど、
GETIDとCTRLWINを試してもできなかった。UWSCで終了させる方法はあるのかな?
42:名無しさん@お腹いっぱい。
09/12/14 17:55:50 YldRjkCS0
タスクマネージャーを開かせて、CLKITEMでconime.exeを選択、終了してみちゃどうだい
43:名無しさん@お腹いっぱい。
09/12/14 18:14:38 9JPfc9vT0
うーん、そういう方法しかないのか
44:名無しさん@お腹いっぱい。
09/12/14 18:18:53 Bshp7Krq0
>>41
DOSCMD("tskill conime")
とかじゃない?
45:名無しさん@お腹いっぱい。
09/12/14 18:34:19 J++hvE3G0
>>44
コマンドの説明ではなんか微妙にちがうっぽいけど、メモ帳は終了できたよ。
普通はtaskkillとかtasklist使うって書いてあるけど、Homeエディションだからか入ってないんだよね。
tasklistが使えたら便利なんだけど。
API使って取得するより、DOSコマンドのパイプ使って絞り込んだ方が早いしね。
tasklist | find "notepad"とか。
>>41
ちなみにUWSCの関数ではIDでしか制御できないけどIDが取得できないので制御できないね。
46:名無しさん@お腹いっぱい。
09/12/14 18:47:09 Bshp7Krq0
>>45
IDが言語っぽいなw
つ qprocessコマンド
47:名無しさん@お腹いっぱい。
09/12/15 00:00:11 J++hvE3G0
>>46
それも超マイナーなJ++・・
qprocessね。なるほど。
UWSCで使ったら便利なコマンドとかバッチとかまとめたら便利かも・・・って環境によるんだよね。
関連ってことで一応あげとくか。
初心者〜管理者まで必読!コマンドライン(DOS Pt.8)
スレリンク(win板)
【.cmd】 バッチファイルスクリプト %5 【.bat】
スレリンク(tech板)
48:41
09/12/15 06:41:43 vPOWhoxM0
そうだった、肝心なDOSコマンドのこと書くの忘れてた。ごめん
DOSCMD("taskkill /im conime.exe")
で終了させる方法はもう試してたんだけど、
DOSコマンドを使うとconime.exeが自動起動するから
UWSCでDOSコマンドを使ったときに、起動したconime.exeも一緒にkillできないかなと思って
UWSCだと方法はDOSコマンドしかないみたいだから
DOSコマンドを使うときに一緒にDOSCMD("taskkill /im conime.exe")と書くしかないか
49:名無しさん@お腹いっぱい。
09/12/15 15:06:20 9Zmrpz910
>>41
っ 一口メモ
Conime.exe を起動しないようにする
[HKEY_CURRENT_USER\Console]]
"LoadConIme"=dword:00000000
50:名無しさん@お腹いっぱい。
09/12/17 14:08:44 gJ3JtLvf0
>>41
CTRLWIN() でイけたよ @XP Home SP3
DIM path = "C:\WINDOWS\system32\conime.exe"
DIM i
FOR i=0 TO GETALLWIN()-1
IFB STATUS(ALL_WIN_ID[i], ST_PATH) = path THEN
CTRLWIN(ALL_WIN_ID[i], CLOSE)
BREAK
ENDIF
NEXT
51:名無しさん@お腹いっぱい。
09/12/17 14:18:13 fLsGSbJB0
>>50
すごいけどやりたくないんじゃないかな。
まあ>>45のこの一文は間違いって分かったけど。
> ちなみにUWSCの関数ではIDでしか制御できないけどIDが取得できないので制御できないね。
52:名無しさん@お腹いっぱい。
09/12/17 23:29:02 uV4iSpsO0
ググっててスクリプトの多重起動禁止で
既に起動している場合自身を終了ってのがあったんだけど
if getid(status(getid(GET_THISUWSC_WIN), st_title),status(getid(get_thisuwsc_win),st_class) > 0 then ExitExit
コピペして起動するとSyntaxErrorって出る
どこが間違ってるの?
53:名無しさん@お腹いっぱい。
09/12/17 23:36:50 uV4iSpsO0
あ、自己解決したかも
)
が一つ足りないんだよね?
54:名無しさん@お腹いっぱい。
09/12/18 03:18:11 PR8RGQ0b0
うん
55:名無しさん@お腹いっぱい。
09/12/18 15:21:16 nijyYsTD0
basicの
go to 文のように
指定行へ飛んで再び命令を実行するコマンドはありますか?
56:名無しさん@お腹いっぱい。
09/12/18 15:26:19 vrRma16p0
>>55
なさそうなので次のようにして代用している
たぶんPROCEDUREとかにした方が簡単だろうけどね
WHILE TRUE
処理(必ず行う処理)
if 条件 then break
処理(条件により飛ばす処理)
WEND
57:名無しさん@お腹いっぱい。
09/12/18 15:39:47 8nryPwZy0
>>56
ありがとうございます
やはり工夫しないと代用はできないようですね
58:名無しさん@お腹いっぱい。
09/12/18 15:49:09 sdiE7QKM0
>>56
そういうbreakの使い方って可読性低いんじゃない?
やるなら
ifb
(条件により飛ばす処理)
endif
とか処理の範囲を明確にするほうがいいような気がする。
…まぁ、俺はそうしてる、ってだけだけど。
59:名無しさん@お腹いっぱい。
09/12/18 16:19:03 vrRma16p0
>>58
普通ならたぶんifb 〜endifだろうね
ただ、何を作ってたか忘れたけどどうしてもifbで出来ないケースにぶち当たってしまい、
苦肉の策で考えてやってみたんだ。それ以来こっちのほうを使っている
思い出そうとしても思い出せないくらいだけど、gotoなくてしばらく苦しんだことだけ覚え
てる
そもそも WHILE TRUEの時点でかなり特殊な使い方をしてるって意識できるループに
なるからね。ループを脱出できるのはbreakしかできないんだ
60:名無しさん@お腹いっぱい。
09/12/18 16:29:12 2K48D2BC0
> ifb OK then
> ifb OK then
> ifb OK then
> OK処理
> endif
> endif
> endif
↑では行数が増えた分だけインデントが深くなるので
> while true
> if NG then break
> if NG then break
> if NG then break
> OK処理
> wend
↑のように書いたりするんです。
でもOKとNGとがループの抜けと共に混じることになるので
↓のように、関数を使うのがベターかな。
> ifb !処理() then // 普通はエラーの場合に条件分岐なので、falseを反転して分岐処理
> NG後始末
> else
> OK後処理
> endif
>
> Function 処理()
> 処理 = false // 失敗に備えてエラーをセット
> if NG then exit
> if NG then exit
> if NG then exit
> OK処理
> 処理 = true // 成功したら成功フラグをセット
> FEND
61:名無しさん@お腹いっぱい。
09/12/18 17:45:48 SLXkS1nI0
ifbよりbreakの方がgotoっぽいからbreak使ってる
62:名無しさん@お腹いっぱい。
09/12/18 18:21:51 dGzexJ6N0
全然素人だからアホな考えかもしれないけど
uwscにgoto処理できる機能を作者さんが付け加えることはできるの?
63:名無しさん@お腹いっぱい。
09/12/18 18:42:22 in2xK9mD0
>>62
goto のように他の行へ移動したいのですが
初歩的な質問ですみません。
VBAでいう goto みたいな命令文はあるのでしょうか?
よろしくお願いします。
DATE:2007/1/17(Wed) 13:26 No.474
RE:goto umiumi
ありません。
#将来的にも付ける気はありません
64:名無しさん@お腹いっぱい。
09/12/18 21:30:11 WhncmQLP0
あったほうが便利なのにね
65:名無しさん@お腹いっぱい。
09/12/18 22:35:34 Rqu21NSB0
goto使っちゃ 負けだと思ってる 個人的にネ
66:名無しさん@お腹いっぱい。
09/12/18 23:42:48 6/ZSokwM0
使い始めでカンタンな動作しかさせないつもりだったんだけど
とあるサイトを sleipnirでバックグラウンドで操作したいんだけど
アクティブウィンドウで動作させる場合は KBDで事足りてるだけどPC占有されちゃうんで
バックグラウンドでやりたい。
id = GETID("Sleipnir")
MOUSEORG(GETCTLHND(id, "Internet Explorer_Server"), 2)
KBD(VK_TAB,CLICK)〜
とかやってもうんともいわなくて
SCKEY(id, VK_TAB) これをやるとウィンドウがアクティブになってしまう。
URLリンク(uenomemo.blog31.fc2.com)
これを参考にしようかと思ったんだけど さっぱり。
pnir = CreateOLEObj("Sleipnir.API")と宣言されてもあとどうしていいかわからない。
誰か教えてください。
67:名無しさん@お腹いっぱい。
09/12/19 00:05:02 ATzk7yJS0
CLKITEM使えよw
68:名無しさん@お腹いっぱい。
09/12/19 00:05:38 67QaJwyf0
こりゃまた大胆なマルチポストだな…。
69:名無しさん@お腹いっぱい。
09/12/19 05:47:10 8hxMfkWq0
そのレベルから教えるのは無理なので
まずは3の教則本でも買って勉強してきてください
70:名無しさん@お腹いっぱい。
09/12/20 03:13:13 sezMof5L0
>>66
sleipnirで操作する必要性がわからない。
sleipnirって中身IEでしょ?
だから普通にIEを制御すればいいと思うんだけど。
71:66
09/12/20 07:35:14 bLgdGkWj0
67-70とりあえず本は注文しといた。
sleipnirに拘ってはいないんだけど、普段使ってるからなんとなく。
IEと同じだからやることは同じかなと。
ま、まだ出来てないんだけどね。理解するまでもう少し時間かかるかな〜
72:名無しさん@お腹いっぱい。
09/12/20 11:24:50 67+0bBGV0
Operaで動かしたいよー
73:メモ
09/12/20 14:12:47 sezMof5L0
OLEEVENT( オブジェクト, インタフェース名, イベント名, Procedure名 )
インタフェース DWebBrowserEvents2
void BeforeNavigate2(java.lang.Object pDisp, com.ms.com.Variant URL, com.ms.com.Variant Flags, com.ms.com.Variant TargetFrameName, com.ms.com.Variant PostData, com.ms.com.Variant Headers, boolean[] Cancel)
void CommandStateChange(int Command, boolean Enable)
void DocumentComplete(java.lang.Object pDisp, com.ms.com.Variant URL)
void DownloadBegin()
void DownloadComplete()
void NavigateComplete2(java.lang.Object pDisp, com.ms.com.Variant URL)
void NewWindow2(java.lang.Object[] ppDisp, boolean[] Cancel)
void OnFullScreen(boolean FullScreen)
void OnMenuBar(boolean MenuBar)
void OnQuit()
void OnStatusBar(boolean StatusBar)
void OnTheaterMode(boolean TheaterMode)
void OnToolBar(boolean ToolBar)
void OnVisible(boolean Visible)
void ProgressChange(int Progress, int ProgressMax)
void PropertyChange(java.lang.String szProperty)
void StatusTextChange(java.lang.String Text)
void TitleChange(java.lang.String Text)
新しいページが開くときに動くには BeforeNavigate2、TitleChange、NewWindow2
開き終わってから動くには NavigateComplete2
イベント処理関数が終了しないとその続きが処理されないので、単純に実行タイミングとして使う場合はスレッド呼び出しをする。
途中で別のページを開く可能性があるので、タイマーで終了する必要があるかも。
74:73
09/12/20 18:36:46 NXkHkjdJ0
このスレは今後オレのメモとして使うからお前ら書き込むなよ。
75:名無しさん@お腹いっぱい。
09/12/20 18:54:23 sezMof5L0
了解
76:名無しさん@お腹いっぱい。
09/12/20 19:15:57 wo2Kl350P
メモは非表示にしたいので名前は「うんこメモ」でよろしく
77:名無しさん@お腹いっぱい。
09/12/20 20:15:15 sezMof5L0
// 待ちループなしのIE制御スクリプト
STOPFORM(true)
PUBLIC gIE2
gIE2 = CreateOLEObj("InternetExplorer.Application")
gIE2.visible = True
gIE = CreateOLEObj("InternetExplorer.Application")
gIE.visible = True
ID = HNDToID(gIE.HWND)
OLEEvent( gIE, "DWebBrowserEvents2", "TitleChange", "TitleChange" )
OLEEvent( gIE, "DWebBrowserEvents2", "BeforeNavigate2", "BeforeNavigate2" )
OLEEvent( gIE, "DWebBrowserEvents2", "NewWindow2", "NewWindow2" )
OLEEvent( gIE, "DWebBrowserEvents2", "OnQuit", "OnQuit" )
sleep(60)
CtrlWin(ID, CLOSE)
Procedure OnQuit()
exitexit
FEND
Procedure TitleChange() // キャッシュに入ってない場合に2回呼ばれる。そして1回目はページ受信前のタイトル。
Title = EVENT_PRM[0]
print "TC " + Title
FEND
Procedure BeforeNavigate2() // 1回のページ操作につき1回呼ばれる。
IE = EVENT_PRM[0] // IEオブジェクト
URL = EVENT_PRM[1] // 開くURL
print "BN " + IEGetData( IE, "TAG=title" ) + " " + URL
FEND
Procedure NewWindow2()
EVENT_PRM[0] = gIE2 // 新しく指定するブラウザオブジェクト(自分自身は指定できない)
EVENT_PRM[1] = True // Cancel flag
print "NW"
Fend
78:名無しさん@お腹いっぱい。
09/12/21 12:37:44 9pLp31HK0
>> ID:sezMof5L0
>>74のスレにそんなに顔真っ赤になったのか?
一生懸命メモ貼らなくていいよ。
79:名無しさん@お腹いっぱい。
09/12/21 15:31:16 1MBjkeY90
XPでIE6使ってるけど、”ファイルのダウンロード”ダイアログではバックグラウンドで保存ボタンをクリックできないんだけど
これってダイアログが裏で動くのを却下してるってことなのかな。
いまさらだけど、たまにしか作らないとそういうところで引っかかる。
最初から表にいてもなんかクリックできなくて一旦裏にもって行かないといけなかったり。
結局AACで指定しないといけない。
”名前を付けて保存”ではそんなことなさそうなんだけど。
”名前を付けて保存”の上書き確認とかのメッセージボックスなら自作のGetChldID()ですばやく確実にIDをゲットしてクリックできるんだけどなあ。
> Until !ClkItem( DlgID, "保存", CLK_BTN or CLK_SHORT or CLK_BACK )
> Result = !CancelIfOverWrite(DlgID, 20)
> // ID: 名前を付けて保存ダイアログのID
> // false: キャンセルしてない true: キャンセルした
> Function CancelIfOverWrite(ID, TLimit)
> Result = false
> print "called CancelIfOverWrite()"
> Repeat
> sleep(0.1); TLimit = TLimit - 0.1; if TLimit < 0 then exit
> if !IDToHnd(ID) then exit
> CID = GetChldID( ID )
> Until 0 < CID
> // 上書き確認メッセージ処理
> Result = true
> while true
> ifb 0 < CID then
> ClkItem( CID, "いいえ" )
> Else
> ClkItem( ID, "キャンセル" )
> Endif
> sleep(0.3); TLimit = TLimit - 0.3; if TLimit < 0 then exit
> if !IDToHnd(ID) then exit
> CID = GetChldID( ID )
> wend
> FEND
80:名無しさん@お腹いっぱい。
09/12/21 15:44:52 1MBjkeY90
あと、>>77のBeforeNavigate2でIEオブジェクトをスレッドに渡して処理しようとしても、
IEオブジェクトを使うときにエラーになる。
グローバル変数を使ったりvarで渡したりしてみたけどどーしてもエラーになる。
普通にスレッド実行するときにはvar引数でIEオブジェクトを渡して使えてたんだけど、
BeforeNavigate2でスレッド呼び出ししたらなぜか駄目だ。
結局BeforeNavigate2では開始フラグをセットして、関数呼び出しは普通に待ちループでやった。
まあBeforeNavigate2も何度か呼ばれたりするみたいだしそのほうが2重起動とかなくてよかったみたい。
もしかして2重起動されるのが原因・・なわけないな。ちゃんと選別してたから。
81:名無しさん@お腹いっぱい。
09/12/21 16:01:58 GyHfCZ1l0
独り言お疲れ様です
82:名無しさん@お腹いっぱい。
09/12/21 22:51:55 qrX4Zb5TP
質問ならまだしも独り言口調ってマジムカつく
もっと読んでる人の事を考えてほしい
83:名無しさん@お腹いっぱい。
09/12/22 09:25:16 /egSySEF0
>>82
質問ならまだしも独り言口調ってマジむかつきませんか?
もっと読んでる人のことを考えて欲しいと思っているのですが、貴方の考えはどうでしょう?
84:名無しさん@お腹いっぱい。
09/12/22 11:16:08 Y5j4vTTi0
>>82は釣りだろ。
85:名無しさん@お腹いっぱい。
09/12/25 22:12:23 QQjADlGN0
DOSコマンドの
pushd X:\Temp
del /q *.*
for /D %%f in ( * ) do rmdir /s /q "%%f"
というのをUWSCでやろうとして
DOSCMD("pushd X:\Temp<#CR>del /q *.*<#CR>for /D %%f in ( * ) do rmdir /s /q <#dbl>%%f<#dbl>", false, true)
と書いたけど、ちゃんと動いてくれない
どこが間違ってるの?
86:名無しさん@お腹いっぱい。
09/12/25 22:22:33 PGzvFXxt0
<#CR>で繋げないんだろう。
|使うかバッチファイル作るかすればいいんじゃないかな?
87:名無しさん@お腹いっぱい。
09/12/25 23:15:19 QQjADlGN0
だめだ、俺の知識じゃどうやってもできない
おとなしくバッチファイルにしとくわ
88:名無しさん@お腹いっぱい。
09/12/26 08:32:23 scMOjuw20
>>85
複数のコマンドを連続で実行するなら丸括弧と改行で区切ればいいよ。
普通にコマンドラインで
> ( dir
とだけ入力すれば、More?って聞いてくる。
> )
で閉じるまで実行待ち状態。
パイプも連続実行だけど後のやつが受け取ったものをどう処理するか分からないからね。
しかしなんでループ処理でrmdirしちゃうのかねえ。
89:85
09/12/26 09:25:34 MKs2n1Uw0
動かなかった原因がわかった
UWSCスクリプトでやるときは%が一つ余分になるんだ
>>88
URLリンク(okwave.jp)
俺はここから丸写ししただけ
90:名無しさん@お腹いっぱい。
09/12/27 19:25:42 Y9u003Cq0
UWSCではっていうか、
VIDタグに流し込まれたHTMLって普通にDOMアクセスできないですよね。
だけどHTMLソースコードをテキストで構造解析するのはちょっと大変。
そこで、DIVタグのIDさえ取れればその配下のエレメントを処理できる関数を書いてみました。
判定関数をEVALでCALLすることで汎用的に使えます。
まだ動かしてはいないんだけど、一応EVALが関数を実行してオブジェクトを返せることは確認しました。
>// DOMアクセスで再帰的に配下のエレメントをたどる。
>// EVALの結果がemptyでなくなったらやめて結果として返す。
>Function SrchDomTree( elm, func )
> result = empty
> // 先に直接の子ノードを調べる
> for i = 0 to elm.childNodes.length
> ret = eval(func)
> ifb ret then
> result = ret
> exit
> endif
> next
> // 孫ノードに入っていく
> for i = 0 to elm.childNodes.length - 1
> ifb elm.childNodes[i].childNodes.length then
> ret = SrchDomTree( elm.childNodes[i], func )
> ifb ret then
> result = ret
> exit
> endif
> endif
> next
>Fend
91:名無しさん@お腹いっぱい。
09/12/27 19:42:39 Y9u003Cq0
おっと。引数を追加する仕組みを忘れてました。
eval(func)のところは
eval( func + "(" + elm.childNodes[i] + env +")" )
呼び出しは
SrchDomTree( elm, "func", ", 引数2, 引数3" )
って感じになるかな?
判定関数はこんな感じ。
>// エレメントのouterHTMLを取ってAタグならIMG srcに"video_download.gif"があるか調べ、
>// あればouterHTMLからリンクアドレスを取得
>Function GetFLVLink(elm)
> result = empty
> str = elm.outerHTML
> ifb 1 = Pos( "<A", str ) then
> ifb Pos( "video_download.gif", BetweenStr( str, "src=<#DBL>", "<#DBL>" ) ) then
> result = BetweenStr( str, "href=<#DBL>", "<#DBL>" )
> endif
> endif
>Fend
>
>// 指定されたリンク文字を持つリンクアドレスを取得
>Function GetKWDLink( elm, keyword )
> result = empty
> str = elm.outerHTML
> ifb 1 = Pos( "<A", str ) then
> ifb Pos( keyword, elm.innerHTML ) then
> result = BetweenStr( str, "href=<#DBL>", "<#DBL>" )
> endif
> endif
>Fend
92:名無しさん@お腹いっぱい。
09/12/27 23:50:29 KdIVRt980
ieをアクティブにした状態で以下を実行してみたのですがcom_error例外が発生しました
となってしまします
というか2行目以降でieを使うとエラーになります
解説サイトなど探してもあっさり進んでしまうのですが…何か足りませんか?
よろしくお願いします
ie = CreateOLEObj("InternetExplorer.Application")
SENDSTR(0, IE.document.title)
93:名無しさん@お腹いっぱい。
09/12/28 00:21:27 GHkoEhmr0
>>92
変数や関数は大文字小文字を区別します。
ieはオブジェクトを受け取ってるけど、IEはオブジェクトを持ってないからエラーになります。
あと、document.titleのtitleもTitleと、大文字小文字を区別するのでエラーになるでしょう。
documentの方は割りと融通が利くようですが。
あと、IEオブジェクトなどはユーザーが閉じると無効になり、使えばエラーになります。
そういうのはそういうものとして使うか、終了を検知してスクリプトを適切に処理するかのどっちかになります。
ID = HNDToID(IE.HWND)
と、IDを取っておいて
ifb ! IDToHnd(ID) then
// IDと元のIEオブジェクトは無効
exit
endif
とやれば、com_error例外にならずに終了を判定できます。
IDToHnd()は終了検知に便利なのでお勧めです。
ちなみにウィンドウハンドルのゼロはデスクトップを意味するので、本来は数値で有効無効を判定できるものではないと思います。
94:名無しさん@お腹いっぱい。
09/12/28 01:24:44 8NfAzOMC0
win7では使用できますか?
95:名無しさん@お腹いっぱい。
09/12/30 11:24:56 3SgEgPry0
>>94
多分使えますよ。
でもいろいろ気をつけることはあるようです。
URLリンク(www.uwsc.info)
96:名無しさん@お腹いっぱい。
09/12/30 11:45:30 3SgEgPry0
OLEEVENTを使っていてどーもクラッシュしまくるので、前後にsleep()を入れてみたら少し改善したようだ。
右クリックメニューをポップアップウィンドウとして検出しようとしたけど、
GetWindow( IDToHnd(ID), GW_ENABLEDPOPUP ) で取得できるのはダイアログ・ツールチップのほか、サブメニューだけっぽいね。
1個目のメニューは右クリックメニューですらポップアップじゃないらしい。
GetID( "", "#32768" )でいけるって本家の過去ログに書いてあったんだけど、やっぱそれが現実的だった。
メニューは簡単に閉じるから名前なし親子関係なしでも案外正しく取れるもんだ。
ただ、クリックできない病気のためにうまくいかない。
しかし、サブメニューの操作が必要なときはその方法ではIDが取得できないだろう。
サブメニュー用のID取得関数がたまたまできたので次レスに投稿する。
ちなみに、親子関係はメインウィンドウの子ということになる。
間違っても親メニューの子ではないので注意が必要。
いや、もしかすると親メニューの子であり、メインメニューの孫だったりするかもしれないが。
GetIDでやっているような、タイマーと永久ループの指定可能な関数にしてみたんだが、
それをfor文でやれるかなと思ったけど、回数を決定できる条件じゃないとだめだった。
具体的には、step0で永久ループにしようと思ったんですが、実行時に警告が出ました。
浮動小数点演算ではやってはいけない、ちょうど0になったときだけ終了という条件にすることでシンプルにできました。
ちゃんと動くかは試してないけど、まあ大丈夫でしょう。
ちなみに、動作確認などのテストコードに番号を振ってるんですが、そのfor文が108番でした。
間は結構飛び飛びだけど、年末にその番号にあたったんでなんだか縁起がいいかもです。
97:名無しさん@お腹いっぱい。
09/12/30 11:57:01 3SgEgPry0
// サブメニューのIDを取得する。
// TLimit=-1 : 永久待ち
// TLimit=0 : 1回のみ
// 戻り値 0 : 該当なし -1:ダイアログ表示 その他:サブメニューのID
Function WaitSubMenuPopup( ID, TLimit = -1 )
def_dll GetWindow(hWnd,long):long:user32.dll
Public GW_ENABLEDPOPUP = 6 // ポップアップウィンドウ
result = 0
H = IDToHnd(ID)
Repeat
sleep(0.01)
if 0 < TLimit then TLimit = TLimit - 0.01
retH = GetWindow( H, GW_ENABLEDPOPUP )
if ! retH then continue
retID = HndToID(retH)
Select Status(retID, ST_CLASS)
case "#32768" // メニュー
result = retID
exit
case "#32770" // ダイアログが表示されたらエラー中断
result = -1
exit
Selend
Until ! TLimit
Fend
98:名無しさん@お腹いっぱい。
09/12/31 18:28:22 Z8Iw0iCS0
FOR文の使い方について教えてください。
以下のように書くと10から20までの数字が画面に表示されます。
FOR i = 10 TO 20 STEP 1
FUKIDASI( i)
SLEEP( 1)
NEXT
ところが各数字を10分の1にすると1から1.9までの数字しか表示されません。
FOR i = 1.0 TO 2.0 STEP 0.1
FUKIDASI( i)
SLEEP( 1)
NEXT
これはどうしてなのでしょうか?
99:名無しさん@お腹いっぱい。
09/12/31 19:15:53 8NQ2XvCh0
STEP 0.2だと2が表示されるな。
挙動がようわからん…
何か0.124と0.125の間あたりで切り替わるようだが…
とりあえず
FOR i = 10 TO 20
// 多用するならj = i / 10とかして使う
FUKIDASI( i/10)
SLEEP( 1)
NEXT
とかするのが無難そうね。
100:名無しさん@お腹いっぱい。
09/12/31 22:41:43 WvG0KKdQP
>>98
誤差の影響です。
コンピュータはすべて2進法で計算していますが、
この2進法では0.1という数字を「正確に」扱う事が出来ないのが原因です。
これは私たちの身の回りにもよくある話です。
私たちが普段使っている10進法では「1/9」を小数で表現すると
0.1111・・・ですよね。
1/9を9個足せばもちろん1です。
しかし
0.111111111111111111と途中で数字を切り捨てて計算を続けたらどうでしょうか?
これを9個足しても
0.999999999999999999にしかならず、決して1にはなりませんね。
もちろん工夫をする事によってこの問題を回避する方法を持っている
計算プログラムも存在していますが、難しい処理が必要になるため
プログラムの価格が高価であったり計算する時間が長くなったりします。
uwscのようなプログラムでは一般的に誤差を持っています。
誤差を極力減らすためには>>99さんがおっしゃるように
なるべく整数のまま計算をするのが最も効果的な方法といえます。
101:名無しさん@お腹いっぱい。
10/01/01 00:05:54 zRjPwPJp0
>>100
お前、頭いいな。
どこ大学出よ?
102:名無しさん@お腹いっぱい。
10/01/01 01:08:17 SeLmUNNh0
この場合は誤差はないと思いますけど。
原因は多分、0.0を0と計算できないこと・・・
いや、やっぱり誤差かな?
回数を計算するときにUWSC内部で
(2.0-1.0)/0.1とかやってるんだろう。
10進数の0.1は、2進数で・・・
URLリンク(www.infonet.co.jp)
> ところで、10進数の 0.1 は、2進数では正確に表すことができず、 その近似値は 0.00011001100110011001100 … になります。
てことは・・やべ>>97は無限ループだ。
全て100倍して整数値で計算しないと。
んでもって確実に整数値にするためにINT()とか使わないと。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4268日前に更新/257 KB
担当:undef