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;
}

自己満足のプログラムですね。
明日はこれを使ったプログラムが紹介できればいいなのココロだー(小沢昭一風味)。