1 名前:名無しさん@お腹いっぱい。 [2009/12/09(水) 05:27:33 ID:J1DL1P1U0] Windowsを自動化させるツールUWSC。 www.uwsc.info/ uwsc使いのみなさま、マターリ己のスクリプトを晒しましょ。
2 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/09(水) 05:28:50 ID:J1DL1P1U0] ●質問したい方へ。 「○○作れますか?」→ スクリプトを期待するのはお門違い。作れるか作れないか教えてくれる人はいるかも。 「○○が作りたい」→ 自分作ればいいんじゃない? 「○○作って下さい」→ 依頼スレじゃありません。 過去ログを見る、検索する等、自分で出来る事を書き込む前にするように。 自力で作ったのを晒すか、具体的な解らない場所を提示して、改善点や解決策を求めるようにしましょう。 ●スクリプトを晒す上での注意 他人が読みやすいようにインデントを付けるように。解らない人はググレ。 (タブインデントは使えないんだぜ 全角スペース等に 変換しておくべし) 言いたい事に関係無い部分は 〜○○の処理〜 や 処理A 等のようにし、 必要な部分を晒すようにする。 ●他人の書いたスクリプトを安易に実行しないように。 ハードディスクをフォーマットされたりしても、自己責任。 前スレ 自動化ツールuwsc使いよ集まれ4 pc12.2ch.net/test/read.cgi/software/1235990960/
3 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/09(水) 06:14:55 ID:J1DL1P1U0] UWSCスクリプトの解説(初歩の初歩) ttp://big.tm.land.to/handbook/uwsc.htm UWSCで自動化 超速!! Windows マクロテクニック ttp://izagne.com/uwsc/
4 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/09(水) 06:19:43 ID:J1DL1P1U0] 解決マクロマン ttp://blog.livedoor.jp/uwsc/archives/cat_50008789.html SCRIPTS ttp://scripts.web.fc2.com/ UWSCサンプル集 ttp://www.nagomi-jp.net/~liners/uwsc_sample_page.htm UWSCの誘惑 ttp://nem.symphonic-net.com/uwsct/0610uwsct.html UWSCの落し物部屋 ttp://siromasa.xxxxxxxx.jp/
5 名前:名無しさん@お腹いっぱい。 [2009/12/09(水) 19:49:51 ID:wIUeYzw+0] どなたか、教えていただけませんでしょうか? oshiete1.goo.ne.jp/qa5509856.html UWSCはまだマイナーなんでしょうか? ↑では誰も回答してくれません。 この板で質問したほうがよかったかなと後悔。。。
6 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/09(水) 20:40:08 ID:OlCmmWUF0] >>5 まだ前スレが埋まってないよ? それに、そっちで質問してるんだったら、一日くらいは待とうぜ? そのソフトを使ったこと無いから解らんが、 >"winLirc.exe"が準備するキー情報 これはどこに準備されるのか不明なの? 外部プログラムのメモリ読み出すDLLとか使って、準備するキー情報とやらを読み出すか、 ソースに付け加えて赤外線認識時に何か動作させるか、そういう事すればいいんじゃね?
7 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/09(水) 21:28:44 ID:q5sTIjr10] そんな丸投げな質問の仕方ならレスつかなくて当然
8 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/09(水) 21:57:28 ID:8TzPg+9x0] >>5 UWSCもユーザー多いかどうか分からないけど、 それ以上に赤外線リモコン使ってる人が少ないでしょう。 確かにUWSCの起動は遅いので、一瞬で起動して操作するということはできません。 exe化することで少々反応は早くなるかもしれませんが、どれほど効果があるか分かりません。 試用版でDOSコマンドを実行するものをexe化してみましたが、微妙に反応がいい気はします。 効果がありそうな方法は、あらかじめUWSCを起動しておくことですね。 昔よくあったんですよ。 一太郎とかエディタとかをすばやく起動するために、タスクアイコンとして常駐しておくという方法が。 UWSCはそのまま起動すると画面が邪魔だから、1ヶ月くらいSleepするスクリプトを起動しておけばいいんじゃないでしょうか。 とりあえず今やってみたところ・・・変りないですね。 一番いい方法は、常駐しているUWSCにコマンドオプションが送られてそのまま処理するというものですが、 同じスクリプトファイルでも新規に起動してしまうし、UWSCは外部からの呼び出しができない仕様になっているので無理ですね。 DOSのバッチファイルを起動するのはとても早いんですよ。 DOSだけでやれればそれでいいと思います。
9 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/09(水) 22:51:53 ID:8TzPg+9x0] >>5 けど、UWSCを使いたければ、こういう方法があります。 1.UWSCのループでクリップボードを監視 2.DOSでクリップボードにコマンド発行 3.コマンドの種類ごとに機能を実行 この方法ならコンスタントに、DOSコマンド実行(0.1秒)+UWSCのSleep時間(0.1秒)で0.2秒後にはコマンドを実行できるでしょう。 このコマンドを使います。 ttp://www.vector.co.jp/soft/winnt/util/se328049.html 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 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/09(水) 23:43:52 ID:wIUeYzw+0] >>6-9 回答ありがとうございました。
11 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/09(水) 23:47:54 ID:JwROkqhK0] >>8 ちとツッコミ。 >exe化することで少々反応は早くなるかもしれません コンパイルしている訳ではありませんので スピードが速くなる事はありません。 サイズもUWSC本体と同程度になります。 ※ UPX等を使えばサイズは3分の1程になります(UWSC本体の圧縮は厳禁) by umiumi >確かにUWSCの起動は遅い 関連づけしておけば起動速度自体は特に気にならないような… 計算処理が (たとえi=i+1だけでも)あると速度的に相当見劣りするのは確かだけど。
12 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/09(水) 23:55:55 ID:wIUeYzw+0] >>9 ありがとうございます。 DOSのバッチファイルということで、clip.exeをちょっと実験してみました。 なんせ、DOSコマンドはdir、copy、path、mkdirぐらいしか使ったことがありませんし(そもそもプログラミング自体、大昔にアセンブラをいじった程度です) ご教授頂いただいたことは、(あくまで私の解釈ですので間違っていたらご指摘ください)DOSコマンドでWinLirc.exeのデータを取得してクリップボードにコピー、 それをUWSCで扱う・・・ということだと理解しました。 残念ながら、clip.exeの動作は理解したのですが、DOSコマンドを使っていかにwinlirc.exeから情報を得るのかがわかりません。 許せるならば、貴殿の知識をもう少しお分けいただければと思います。お願いします。
13 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/09(水) 23:58:15 ID:8TzPg+9x0] 前スレで出てたAutoHotKeyだとWindowsアプリのようにメッセージを受け取って処理できるんですよね。 バッチファイルでSendMessageできれば待ちループもなくて平均0.5秒始動が早くなると思って探してみました。 @はOLEオブジェクトなのできっと遅いです。 AはSendMessageというDOSコマンドを自作しているっぽいですが、肝心のコマンドが見つかりませんでした。 BはMessengerサービスを開始してファイアーウォールも無効にして試したけどうまくいかなかった。 @ ttp://plaza.rakuten.co.jp/u703331/diary/20070413/ > コマンドプロンプトから直接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 ttp://www.hm2.aitai.ne.jp/~kagemasa/unigraphics/wbat_post.btw :/マシンファイルの設定 > 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 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/10(木) 00:37:38 ID: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 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/10(木) 22:32:15 ID:+EDF+/cG0] >>14 こんばんは、12です。ご説明、よくわかりました。 早速、作ってみました。 もう、完璧です! マシーンの動作ってこうでなくっちゃ、という感覚です。 UWSCも>>9 にちょっと手を加えただけで完成です。 (DOSのechoコマンドがスペースとCRLFを引き連れてやってくるところはてこずりました。) 重ねてお礼申し上げます。ありがとうございました。 ついでといっては、なんですが、 >>8 >UWSCはそのまま起動すると画面が邪魔だから、1ヶ月くらいSleepするスクリプトを起動しておけばいいんじゃないでしょうか。 ここの部分を詳しく教えていただければと思います。 SLEEPだけのスクリプトを動かしておけば、他のは隠れて動く、ということなのでしょうか? これも、実験してみます。
16 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/10(木) 23:49:40 ID:AMT7Pyke0] >>15 余分なものが入ってましたか。気がつきませんでした。 > ここの部分を詳しく教えていただければと思います。 サクラエディタとかの常駐型アプリを使ってみると分かりますが、一旦起動したらメモリ上に残るので、 以降のファイルを開く動作が非常に速くなります。 UWSCも同じように、一つ常駐させればスクリプトの読み込みが早くなるかなと思ったんですが、 UWSCは別プロセスで起動するのでそうはならないようでした。 常駐させる方法として次の1行を実行させる方法を提案しました。 スクリプトファイルを直接実行すれば、UWSCのメイン画面は表示されないので。 sleep(60*60*24*30) // これで1ヶ月スリープ 「画面が邪魔」というのは、UWSCの画面は最前面に表示されるので、常時起動しているとしたら邪魔ですよね? スクリプトファイルの関連付けで起動することで、メイン画面は非表示になるのを利用しようというわけです。
17 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/11(金) 00:03:06 ID:TAkxOJ9A0] 大文字小文字にこだわりのあるおにーさんたちはどう書いてるの?(´・ω・`) CREATEOLEOBJ CreateOLEObj CreateOleObj Createoleobj
18 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/11(金) 00:12:03 ID:bDw5dpFU0] CreateOLEObj なんとなく、クセかなぁ。 全部大文字とか全部小文字はなんとなくぱっと見で読み辛い気がするね。 ちょっと前流行った日本語の文字の場所を入れ替えるどうのこうののコピペじゃないけど、 英語でも頭文字の部分が強調されていれば、感覚的に解る感じがするからなー。
19 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/11(金) 00:53:34 ID:3W3bqgjj0] CreateOLEobj objは小文字で書いちゃうなぁ。 objIEとかで探すとそういう書き方が多かったもんで。
20 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/11(金) 01:27:12 ID:Zaw60Q490] CREATEOLEOBJ 理由:単語辞書の登録がたまたまそうなってから…
21 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/11(金) 01:40:56 ID: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 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/11(金) 01:57:52 ID:mXLjG1QG0] For i = 0 to 10 - 1 GetID(Title, Class)
23 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/11(金) 02:02:40 ID:yv164UXr0] 有料でいいから文法をjavascript仕様にしたものを出してくれないかな。需要はあると思うんだけど。
24 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/11(金) 02:25:02 ID:ASOL9Pzm0] c系統に慣れているから while wend とか ifb endif とかになれるのはつらかったけど、慣れるとそれなりにいい^^
25 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/11(金) 04:22:04 ID:iOSKkb9p0] FOR I = 0 TO (10 - 1)
26 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/11(金) 11:03:24 ID: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 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/12(土) 03:00:40 ID:7cmFQzAf0] CLKITEMで項目を選択したいのだが項目名が変化する場合って どうやって取得するんでしょうか CLKITEM(id, "ダウンロード済 (X)", CLK_LSTVEW or CLK_LEFTCLK) 具体的には Xが変化するわけですが、Xのところに設定する ワイルドカードみたいなのないんでしょうか
28 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/12(土) 04:18:37 ID:HwVuwznO0] CLK_SHORT
29 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/12(土) 14:23:00 ID:M7k2JrZE0] 押されてるキーを全て取得する方法って無いかな? GETKEYSTATE使うのは無謀すぎるし・・・ そういうスクリプトやDLLがあるなら教えてくれるとありがたい
30 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/12(土) 15:07:15 ID:TyWlORGEO] >>23 javascript仕様って何? 文法の話?標準関数とか?
31 名前:27 mailto:sage [2009/12/12(土) 15:29:54 ID:7cmFQzAf0] >>28 できました サンクスです
32 名前:その1 mailto:sage [2009/12/12(土) 17:11:47 ID: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 mailto:sage [2009/12/12(土) 17:14:29 ID: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 mailto:sage [2009/12/12(土) 17:16:07 ID: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 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/12(土) 17:22:27 ID: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 mailto:sage [2009/12/12(土) 17:37:15 ID: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 mailto:sage [2009/12/12(土) 19:03:03 ID:3Ho66wEG0] なんか、キーを4つほど押したことになってるな・・・ んで普通に3つ押せる。
38 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/13(日) 01:05:59 ID:Znj2ND940] つ ttp://www3.bigcosmic.com/board/s/board.cgi?id=umiumi&mode=all&no=296&log=ON&cnt=3 つ ttp://www3.bigcosmic.com/board/s/board.cgi?id=umiumi&mode=all&no=316&log=ON&cnt=3 実用面では厳しいものがあると思うよ…。素直にAH(ry
39 名前:35 mailto:sage [2009/12/13(日) 11:16:19 ID: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 mailto:sage [2009/12/13(日) 11:28:01 ID: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 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/14(月) 17:44:27 ID:9JPfc9vT0] ちょっと質問が ウィンドウのないプロセスを終了させたいときはどうすればいいの? 具体的に言うとconime.exeをUWSCを使って終了させたいんだけど、 GETIDとCTRLWINを試してもできなかった。UWSCで終了させる方法はあるのかな?
42 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/14(月) 17:55:50 ID:YldRjkCS0] タスクマネージャーを開かせて、CLKITEMでconime.exeを選択、終了してみちゃどうだい
43 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/14(月) 18:14:38 ID:9JPfc9vT0] うーん、そういう方法しかないのか
44 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/14(月) 18:18:53 ID:Bshp7Krq0] >>41 DOSCMD("tskill conime") とかじゃない?
45 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/14(月) 18:34:19 ID:J++hvE3G0] >>44 コマンドの説明ではなんか微妙にちがうっぽいけど、メモ帳は終了できたよ。 普通はtaskkillとかtasklist使うって書いてあるけど、Homeエディションだからか入ってないんだよね。 tasklistが使えたら便利なんだけど。 API使って取得するより、DOSコマンドのパイプ使って絞り込んだ方が早いしね。 tasklist | find "notepad"とか。 >>41 ちなみにUWSCの関数ではIDでしか制御できないけどIDが取得できないので制御できないね。
46 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/14(月) 18:47:09 ID:Bshp7Krq0] >>45 IDが言語っぽいなw つ qprocessコマンド
47 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/15(火) 00:00:11 ID:J++hvE3G0] >>46 それも超マイナーなJ++・・ qprocessね。なるほど。 UWSCで使ったら便利なコマンドとかバッチとかまとめたら便利かも・・・って環境によるんだよね。 関連ってことで一応あげとくか。 初心者〜管理者まで必読!コマンドライン(DOS Pt.8) ttp://pc12.2ch.net/test/read.cgi/win/1243134619/ 【.cmd】 バッチファイルスクリプト %5 【.bat】 ttp://pc12.2ch.net/test/read.cgi/tech/1242268171/
48 名前:41 mailto:sage [2009/12/15(火) 06:41:43 ID:vPOWhoxM0] そうだった、肝心なDOSコマンドのこと書くの忘れてた。ごめん DOSCMD("taskkill /im conime.exe") で終了させる方法はもう試してたんだけど、 DOSコマンドを使うとconime.exeが自動起動するから UWSCでDOSコマンドを使ったときに、起動したconime.exeも一緒にkillできないかなと思って UWSCだと方法はDOSコマンドしかないみたいだから DOSコマンドを使うときに一緒にDOSCMD("taskkill /im conime.exe")と書くしかないか
49 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/15(火) 15:06:20 ID:9Zmrpz910] >>41 っ 一口メモ Conime.exe を起動しないようにする [HKEY_CURRENT_USER\Console]] "LoadConIme"=dword:00000000
50 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/17(木) 14:08:44 ID: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 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/17(木) 14:18:13 ID:fLsGSbJB0] >>50 すごいけどやりたくないんじゃないかな。 まあ>>45 のこの一文は間違いって分かったけど。 > ちなみにUWSCの関数ではIDでしか制御できないけどIDが取得できないので制御できないね。
52 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/17(木) 23:29:02 ID:uV4iSpsO0] ググっててスクリプトの多重起動禁止で 既に起動している場合自身を終了ってのがあったんだけど if getid(status(getid(GET_THISUWSC_WIN), st_title),status(getid(get_thisuwsc_win),st_class) > 0 then ExitExit コピペして起動するとSyntaxErrorって出る どこが間違ってるの?
53 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/17(木) 23:36:50 ID:uV4iSpsO0] あ、自己解決したかも ) が一つ足りないんだよね?
54 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/18(金) 03:18:11 ID:PR8RGQ0b0] うん
55 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/18(金) 15:21:16 ID:nijyYsTD0] basicの go to 文のように 指定行へ飛んで再び命令を実行するコマンドはありますか?
56 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/18(金) 15:26:19 ID:vrRma16p0] >>55 なさそうなので次のようにして代用している たぶんPROCEDUREとかにした方が簡単だろうけどね WHILE TRUE 処理(必ず行う処理) if 条件 then break 処理(条件により飛ばす処理) WEND
57 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/18(金) 15:39:47 ID:8nryPwZy0] >>56 ありがとうございます やはり工夫しないと代用はできないようですね
58 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/18(金) 15:49:09 ID:sdiE7QKM0] >>56 そういうbreakの使い方って可読性低いんじゃない? やるなら ifb (条件により飛ばす処理) endif とか処理の範囲を明確にするほうがいいような気がする。 …まぁ、俺はそうしてる、ってだけだけど。
59 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/18(金) 16:19:03 ID:vrRma16p0] >>58 普通ならたぶんifb 〜endifだろうね ただ、何を作ってたか忘れたけどどうしてもifbで出来ないケースにぶち当たってしまい、 苦肉の策で考えてやってみたんだ。それ以来こっちのほうを使っている 思い出そうとしても思い出せないくらいだけど、gotoなくてしばらく苦しんだことだけ覚え てる そもそも WHILE TRUEの時点でかなり特殊な使い方をしてるって意識できるループに なるからね。ループを脱出できるのはbreakしかできないんだ
60 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/18(金) 16:29:12 ID: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 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/18(金) 17:45:48 ID:SLXkS1nI0] ifbよりbreakの方がgotoっぽいからbreak使ってる
62 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/18(金) 18:21:51 ID:dGzexJ6N0] 全然素人だからアホな考えかもしれないけど uwscにgoto処理できる機能を作者さんが付け加えることはできるの?
63 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/18(金) 18:42:22 ID:in2xK9mD0] >>62 goto のように他の行へ移動したいのですが 初歩的な質問ですみません。 VBAでいう goto みたいな命令文はあるのでしょうか? よろしくお願いします。 DATE:2007/1/17(Wed) 13:26 No.474 RE:goto umiumi ありません。 #将来的にも付ける気はありません
64 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/18(金) 21:30:11 ID:WhncmQLP0] あったほうが便利なのにね
65 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/18(金) 22:35:34 ID:Rqu21NSB0] goto使っちゃ 負けだと思ってる 個人的にネ
66 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/18(金) 23:42:48 ID:6/ZSokwM0] 使い始めでカンタンな動作しかさせないつもりだったんだけど とあるサイトを sleipnirでバックグラウンドで操作したいんだけど アクティブウィンドウで動作させる場合は KBDで事足りてるだけどPC占有されちゃうんで バックグラウンドでやりたい。 id = GETID("Sleipnir") MOUSEORG(GETCTLHND(id, "Internet Explorer_Server"), 2) KBD(VK_TAB,CLICK)〜 とかやってもうんともいわなくて SCKEY(id, VK_TAB) これをやるとウィンドウがアクティブになってしまう。 uenomemo.blog31.fc2.com/blog-entry-52.html これを参考にしようかと思ったんだけど さっぱり。 pnir = CreateOLEObj("Sleipnir.API")と宣言されてもあとどうしていいかわからない。 誰か教えてください。
67 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/19(土) 00:05:02 ID:ATzk7yJS0] CLKITEM使えよw
68 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/19(土) 00:05:38 ID:67QaJwyf0] こりゃまた大胆なマルチポストだな…。
69 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/19(土) 05:47:10 ID:8hxMfkWq0] そのレベルから教えるのは無理なので まずは3の教則本でも買って勉強してきてください
70 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/20(日) 03:13:13 ID:sezMof5L0] >>66 sleipnirで操作する必要性がわからない。 sleipnirって中身IEでしょ? だから普通にIEを制御すればいいと思うんだけど。
71 名前:66 mailto:sage [2009/12/20(日) 07:35:14 ID:bLgdGkWj0] 67-70とりあえず本は注文しといた。 sleipnirに拘ってはいないんだけど、普段使ってるからなんとなく。 IEと同じだからやることは同じかなと。 ま、まだ出来てないんだけどね。理解するまでもう少し時間かかるかな〜
72 名前:名無しさん@お腹いっぱい。 [2009/12/20(日) 11:24:50 ID:67+0bBGV0] Operaで動かしたいよー
73 名前:メモ mailto:sage [2009/12/20(日) 14:12:47 ID: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 mailto:sage [2009/12/20(日) 18:36:46 ID:NXkHkjdJ0] このスレは今後オレのメモとして使うからお前ら書き込むなよ。
75 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/20(日) 18:54:23 ID:sezMof5L0] 了解
76 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/20(日) 19:15:57 ID:wo2Kl350P] メモは非表示にしたいので名前は「うんこメモ」でよろしく
77 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/20(日) 20:15:15 ID: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 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/21(月) 12:37:44 ID:9pLp31HK0] >> ID:sezMof5L0 >>74 のスレにそんなに顔真っ赤になったのか? 一生懸命メモ貼らなくていいよ。
79 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/21(月) 15:31:16 ID: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 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/21(月) 15:44:52 ID:1MBjkeY90] あと、>>77 のBeforeNavigate2でIEオブジェクトをスレッドに渡して処理しようとしても、 IEオブジェクトを使うときにエラーになる。 グローバル変数を使ったりvarで渡したりしてみたけどどーしてもエラーになる。 普通にスレッド実行するときにはvar引数でIEオブジェクトを渡して使えてたんだけど、 BeforeNavigate2でスレッド呼び出ししたらなぜか駄目だ。 結局BeforeNavigate2では開始フラグをセットして、関数呼び出しは普通に待ちループでやった。 まあBeforeNavigate2も何度か呼ばれたりするみたいだしそのほうが2重起動とかなくてよかったみたい。 もしかして2重起動されるのが原因・・なわけないな。ちゃんと選別してたから。
81 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/21(月) 16:01:58 ID:GyHfCZ1l0] 独り言お疲れ様です
82 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/21(月) 22:51:55 ID:qrX4Zb5TP] 質問ならまだしも独り言口調ってマジムカつく もっと読んでる人の事を考えてほしい
83 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/22(火) 09:25:16 ID:/egSySEF0] >>82 質問ならまだしも独り言口調ってマジむかつきませんか? もっと読んでる人のことを考えて欲しいと思っているのですが、貴方の考えはどうでしょう?
84 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/22(火) 11:16:08 ID:Y5j4vTTi0] >>82 は釣りだろ。
85 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/25(金) 22:12:23 ID: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 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/25(金) 22:22:33 ID:PGzvFXxt0] <#CR>で繋げないんだろう。 |使うかバッチファイル作るかすればいいんじゃないかな?
87 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/25(金) 23:15:19 ID:QQjADlGN0] だめだ、俺の知識じゃどうやってもできない おとなしくバッチファイルにしとくわ
88 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/26(土) 08:32:23 ID:scMOjuw20] >>85 複数のコマンドを連続で実行するなら丸括弧と改行で区切ればいいよ。 普通にコマンドラインで > ( dir とだけ入力すれば、More?って聞いてくる。 > ) で閉じるまで実行待ち状態。 パイプも連続実行だけど後のやつが受け取ったものをどう処理するか分からないからね。 しかしなんでループ処理でrmdirしちゃうのかねえ。
89 名前:85 mailto:sage [2009/12/26(土) 09:25:34 ID:MKs2n1Uw0] 動かなかった原因がわかった UWSCスクリプトでやるときは%が一つ余分になるんだ >>88 okwave.jp/qa4178416.html 俺はここから丸写ししただけ
90 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/27(日) 19:25:42 ID: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 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/27(日) 19:42:39 ID: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 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/27(日) 23:50:29 ID:KdIVRt980] ieをアクティブにした状態で以下を実行してみたのですがcom_error例外が発生しました となってしまします というか2行目以降でieを使うとエラーになります 解説サイトなど探してもあっさり進んでしまうのですが…何か足りませんか? よろしくお願いします ie = CreateOLEObj("InternetExplorer.Application") SENDSTR(0, IE.document.title)
93 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/28(月) 00:21:27 ID: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 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/28(月) 01:24:44 ID:8NfAzOMC0] win7では使用できますか?
95 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/30(水) 11:24:56 ID:3SgEgPry0] >>94 多分使えますよ。 でもいろいろ気をつけることはあるようです。 ttp://www.uwsc.info/faq.html
96 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/30(水) 11:45:30 ID:3SgEgPry0] OLEEVENTを使っていてどーもクラッシュしまくるので、前後にsleep()を入れてみたら少し改善したようだ。 右クリックメニューをポップアップウィンドウとして検出しようとしたけど、 GetWindow( IDToHnd(ID), GW_ENABLEDPOPUP ) で取得できるのはダイアログ・ツールチップのほか、サブメニューだけっぽいね。 1個目のメニューは右クリックメニューですらポップアップじゃないらしい。 GetID( "", "#32768" )でいけるって本家の過去ログに書いてあったんだけど、やっぱそれが現実的だった。 メニューは簡単に閉じるから名前なし親子関係なしでも案外正しく取れるもんだ。 ただ、クリックできない病気のためにうまくいかない。 しかし、サブメニューの操作が必要なときはその方法ではIDが取得できないだろう。 サブメニュー用のID取得関数がたまたまできたので次レスに投稿する。 ちなみに、親子関係はメインウィンドウの子ということになる。 間違っても親メニューの子ではないので注意が必要。 いや、もしかすると親メニューの子であり、メインメニューの孫だったりするかもしれないが。 GetIDでやっているような、タイマーと永久ループの指定可能な関数にしてみたんだが、 それをfor文でやれるかなと思ったけど、回数を決定できる条件じゃないとだめだった。 具体的には、step0で永久ループにしようと思ったんですが、実行時に警告が出ました。 浮動小数点演算ではやってはいけない、ちょうど0になったときだけ終了という条件にすることでシンプルにできました。 ちゃんと動くかは試してないけど、まあ大丈夫でしょう。 ちなみに、動作確認などのテストコードに番号を振ってるんですが、そのfor文が108番でした。 間は結構飛び飛びだけど、年末にその番号にあたったんでなんだか縁起がいいかもです。
97 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/30(水) 11:57:01 ID: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 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/31(木) 18:28:22 ID: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 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/12/31(木) 19:15:53 ID:8NQ2XvCh0] STEP 0.2だと2が表示されるな。 挙動がようわからん… 何か0.124と0.125の間あたりで切り替わるようだが… とりあえず FOR i = 10 TO 20 // 多用するならj = i / 10とかして使う FUKIDASI( i/10) SLEEP( 1) NEXT とかするのが無難そうね。
100 名前:名無しさん@お腹いっぱい。 [2009/12/31(木) 22:41:43 ID:WvG0KKdQP] >>98 誤差の影響です。 コンピュータはすべて2進法で計算していますが、 この2進法では0.1という数字を「正確に」扱う事が出来ないのが原因です。 これは私たちの身の回りにもよくある話です。 私たちが普段使っている10進法では「1/9」を小数で表現すると 0.1111・・・ですよね。 1/9を9個足せばもちろん1です。 しかし 0.111111111111111111と途中で数字を切り捨てて計算を続けたらどうでしょうか? これを9個足しても 0.999999999999999999にしかならず、決して1にはなりませんね。 もちろん工夫をする事によってこの問題を回避する方法を持っている 計算プログラムも存在していますが、難しい処理が必要になるため プログラムの価格が高価であったり計算する時間が長くなったりします。 uwscのようなプログラムでは一般的に誤差を持っています。 誤差を極力減らすためには>>99 さんがおっしゃるように なるべく整数のまま計算をするのが最も効果的な方法といえます。