アプリ版:「スタンプのみでお礼する」機能のリリースについて

IEの MenuExtに下記のようなスクリプト(html)を登録し、
右クリックメニューから実行したのですが、setTimeoutで
指定した処理が実行されません。

セットした時間が来る前にスクリプトが完了してしまうため
でしょうか?一定時間後の処理を実現するためのお知恵を、
是非みなさんにお伺いしたいです。
( setTimeout関数の使用不使用にはこだわりません)


<script type="text/JScript">
対象ページの情報を取得し asxファイル"asx"を作成

//"asx"を関連付けされたアプリケーションで開く
var wshell = new ActiveXObject("WScript.Shell");
wshell.Run(asx, 1, false);
// 5秒後 "asx"を削除する
var fso = new ActiveXObject("Scripting.FileSystemObject");
setTimeout("fso.DeleteFile(asx);", 5000);
</script>


※ asxファイルはメディアプレイヤーが相手サーバと通信して
再生リストを作成するためのものです。ファイルを開いてすぐ
削除しようとするとエラーになります(数秒たてば削除可能です)

※wshell.Runの第3引数を Trueにするとメディアプレイヤーを
閉じるまでスクリプトの処理を待機します。目的を達成できそう
ですが、プレイヤーを閉じずに同じスクリプトを実行すると問題が
起きます

A 回答 (4件)

wscript実行を


wshell.Run("c:\\test.js",1 ,true);
にするのは、jsファイルの関連付けがwscriptであるのが前提なので
ちょっと気になるのですが、個人使用等であれば問題ないですね。

さて、外部スクリプトファイルを使用しない方法ですが、
以下があります。

<script type="text/JScript">
var wshell = new ActiveXObject("WScript.Shell");
wshell.Run("c:\\test.txt", 1, false);
var start = (new Date()).getTime();
while(true){
var current = (new Date()).getTime();
if((current - start) > 5000) break;
}
var fso = new ActiveXObject("Scripting.FileSystemObject");
fso.DeleteFile("c:\\test.txt");
</script>

JavaScriptでwhile(true)の無限ループをタイマーに使うのは
個人的にあまり好きではないため、
この方法は意識の外になってました^^;
(CPUに無駄な負荷がかかりそうで。
また、Firefoxとかだと
ループの回数が多いと
警告が出たりします)

いちおうこれでも動作します。
でも、私のPCではちょっと動作が重くなる気がしてます。
(気のせいかもしれませんが。)
あまりお勧めはしないです・・・。
参考程度に。

この回答への補足

いろいろ試してみました
新しいウィンドウを作りそこでスクリプトを実行すれば
setTimeoutは動作します。ただ、セキュリティーが厳しくなり
FSOなどコンポーネントの呼び出しに問題がありました

モーダルダイアログモードで IEMenuExtを呼ぶと
勝手に閉じないウィンドウが作られるので、setTimeout
が使えます。呼び出しウィンドウの操作ができなくなって
しまうのが弱点ですが、今回のケース(待ち時間が数秒)
ならば問題ないようです

名残惜しいですが、回答を締め切らせていただきます
閲覧してくださった方々、susie=t様
どうもありがとうございました

補足日時:2007/08/31 22:46
    • good
    • 0
この回答へのお礼

度々のご回答ありがとうございます
実は以前、 while文を利用した処理待ちを試したことがあるのですが
メディアプレイヤーの処理が進まず、うまくゆきませんでした

しかし、今回 susie-t様に記述していただいたスクリプトは見事に目的の
動作を実現しました。PentiumIII 1.2GHz, CPU使用率90%の PC環境下で
動いたので、現在一般の PCで通用するスクリプトだと思います
大変参考になりました
(処理待ち時間を多く取り過ぎるとIEから警告が出ますが、秒単位ならば
問題無いようです)

質問の方、無限ループを使わない条件を加えて、もうしばらく続けさせて
ください。みなさまよろしくお願い致します

お礼日時:2007/08/15 19:22

すみません、HTML上でWScriptオブジェクトは使用できないのですね・・・。



そこで、かなり無理やりな方法ですが、HTMLからjsファイルをwscriptで呼び出してみてはどうでしょう。

【test.htm】
<script type="text/JScript">
var wshell = new ActiveXObject("WScript.Shell");
wshell.Run("c:\\test.txt", 1, false);
wshell.Exec("wscript \"c:\\test.js\"");
</script>
【c:\test.js】
var fso = new ActiveXObject("Scripting.FileSystemObject");
WScript.Sleep(5000);
fso.DeleteFile("c:\\test.txt");

以上のスクリプトでc:\test.txtがエディタでオープンされた後、5秒後に消去されることを確認しています。

参考になれば幸いです。
    • good
    • 0
この回答へのお礼

アドバイスをスクリプトに適用させていただいたところ、無事目的の動作を
得ることができました。特に wscript実行を
wshell.Run("c:\\test.js",1 ,true);
にすると test.jsの完了まで HTML側の処理を中断できます
( DelteFile部を HTML側に移すことも可能です)
大変参考になりました。ありがとうございました


今後の理解のため、外部スクリプトファイルを作成せず質問内容を
実現する方法が知りたいです。みなさまよろしくお願いします

susie-t様もよろしければ引き続きお付き合いください

お礼日時:2007/08/12 00:17

すみません、「IEの MenuExt」だったのですね。

。。
WEBページと勘違いしました。
その場合、setTimeoutはwindowオブジェクトのメソッドなので、WEBページ上でしか使えないのだと思います。代わりに、WSHのSleepメソッドというのが使えないかなと思います。(参考URLを参照してください)
ちょっと今試すことができない状況なので申し訳ないのですが。。。参考になれば幸いです。

参考URL:http://msdn.microsoft.com/library/ja/default.asp …
    • good
    • 0
この回答へのお礼

お忙しい中のご回答に感謝します
おっしゃる通りあくまでIEの MenuExtからスクリプトの記述されたHTMLを
呼んだ場合の問題です。
(単にHTMLのダブルクリックなら setTimeoutは正常に働きます)

WScript.sleep は、この問題の解決に最適のメソッドだと思います
しかし HTMLのスクリプトから WScriptをオブジェクト化する方法が
わかりません。
( scriptタグ内にWScript.sleepをそのまま記述。new ActiveXObject
で呼んでみる。<script="type/WScritp">等の記述もダメでした)

お礼日時:2007/08/10 21:17

メディアプレイヤー等固有の問題だとすると分からないのですが、スクリプトと説明を見て気になった点を書きます。



右クリックから実行したということは、スクリプトは関数内に記述されているのですよね?(サンプルはグローバルエリアになっていますが)

その場合、
setTimeout("fso.DeleteFile(asx);", 5000);
の部分を
setTimeout(function(){fso.DeleteFile(asx);}, 5000);
のようにするともしかしたらうまくいくかもしれません。

前者の場合、asxが関数内で定義されていると動作しないです。(グローバルスコープで実行されるため)

違ってたらすみません。
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。感激です
勉強不足のため、言葉の解釈が曖昧で恐縮ですが、グローバルエリアとは
function{ }で囲まれておらず、命令がどんどん実行される部分のこと
ですよね? サンプルは全てグローバルエリアに記述されております。
functionは使ってません

アドバイスしていただいた記述を元のサンプルと、function main1(){ }
で囲んだものとに適用して実行してみましたが、残念ながら setTimeout
部分だけ実行されませんでした

お礼日時:2007/08/09 21:29

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