JScriptでクリップボード操作(InternetExplorerを使わないでみる)
JScriptでクリップボードからテキスト文字列をとりだしたり、クリップボードに格納するスクリプトです。
JScript,VBScriptは直接クリップボードを操作することができません。
で、検索してみるわけですが、
一般的には、InternetExplorerアプリケーションオブジェクトを生成し、
クリップボードから文字列をとりだしたりするようです。
ただこの方法、なんか気持ち悪いなぁとか思いました。
なんで、InternetExplorer上でクリップボードを操作できんの!
パスワードとかカード番号なんかがクリップボード上にあったらまずいじゃん!
勝手にクリップボードの中身覗かれるよ!
IE7ではどうやら対策されているらしいとはききました(クリップボードの中身を操作すると警告が出るらしい?)が、
やっぱり気持ち悪い!
というわけで!
InternetExplorerを経由しないで、かなり強引にクリップボードを操作するようにしてみました。
メモ帳が立ち上がって、パタパタ紙芝居のようにうごきますorz
プログラム
//void delayedSendKeys(キーストロークの配列) //アクティブなウィンドウにキーストロークを送信する // //配列の1要素をキーストローク送信するごとに、時間を空ける。 //キーストロークのアプリケーションでの処理を確実に行うようにする措置。 var delayedSendKeys = function(astrKeys) { var oSh = new ActiveXObject("WScript.Shell"); var l = astrKeys.length; for (var i = 0; i < l; i++) { oSh.SendKeys(astrKeys[i]); WScript.Sleep(100); } return; } //String getClipString(void) //クリップボードのテキストを文字列で返す。 // //InternetExplorerアプリを生成するやり方は嫌だったので、 //メモ帳に張り付けて一時ファイル保存し読み込んでいる。 //IEでクリップボードを操作することに気持ち悪さを感じる。 //パスワードをコピーした状態で悪意のサイトを開いたらパスワード送信されてしまうがな。 //だからIEは使わないでみた(意味不明)。かなりぱたぱたうごく。 var getClipString = function() { var oSh = new ActiveXObject("WScript.Shell"); var oFS = new ActiveXObject("Scripting.FileSystemObject"); var strTemp = oFS.GetDriveName(oFS.GetSpecialFolder(2)) + "\\" + oFS.GetTempName() + ".txt"; oSh.Run("notepad.exe"); while (oSh.AppActivate("無題")==false) { WScript.Sleep(100); } delayedSendKeys(["^v","%f","a","%n",strTemp,"{ENTER}","%f","x"]); while (oFS.FileExists(strTemp)!=true) { WScript.Sleep(100); } var oTS = oFS.OpenTextFile(strTemp); var strRet = oTS.ReadAll(); oTS.close(); while (oFS.FileExists(strTemp)!=true) { WScript.Sleep(100); } oFS.DeleteFile(strTemp); return strRet; } //void setClipString(String) //クリップボードに文字列をセットする。 // //上と同様、InternetExplorerアプリを生成するやり方でなく、 //一時ファイルに保存してメモ帳で開きコピーしている。 //これもぱたぱたうごく。 var setClipString = function(strArg) { var oSh = new ActiveXObject("WScript.Shell"); var oFS = new ActiveXObject("Scripting.FileSystemObject"); var strTempBase = oFS.GetTempName(); var strTemp = oFS.GetDriveName(oFS.GetSpecialFolder(2)) + "\\" + strTempBase + ".txt"; var oTS = oFS.CreateTextFile(strTemp); oTS.Write(strArg); oTS.close(); while (oFS.FileExists(strTemp)!=true) { WScript.Sleep(100); } oSh.Run("notepad.exe "+ strTemp); while (oSh.AppActivate(strTempBase)==false) { WScript.Sleep(100); } delayedSendKeys(["^a","^c","%f","x"]); oFS.DeleteFile(strTemp); return; }
自己満足のプログラムですね。
明日はこれを使ったプログラムが紹介できればいいなのココロだー(小沢昭一風味)。