WSHでのクリップボードアクセス

人力で回答するのに調べてみたのだが、どうも面倒くさいらしい。
そもそもWSHで直接クリップボードにアクセスするI/Fは用意されていないらしい。


最初にたどり着いたのはIEを経由してクリップボードにアクセスするという方法。
スクリプトの出力をクリップボードにコピーすることはできますか - Hey, Scripting Guy!

strCopy = "This text has been copied to the clipboard.";

var objIE = WScript.createObject("InternetExplorer.Application");
objIE.navigate("about:blank");
objIE.document.parentWindow.clipboardData.setData("text", strCopy);
objIE.quit();

(VBSからJSに直してある)
検索するとほとんどこの方法しかひっかからない。


しかし、現在のXP SP2+IE6やIE7などの環境ではセキュリティが厳しくなっていて、どうもこのままのコードでは動作しない。setData()で常にfalseが返ってきて失敗してしまう。
"about:blank"では、インターネットゾーンが適用されるため、インターネットゾーン設定の「スクリプトによる貼り付け処理の許可」が無効にされている(デフォルト)ので、clipboardDataは常に失敗になってしまうようだ。


いろいろ調べて最終的に行き着いたのがこれ。

var OLECMDID_COPY = 12;
var OLECMDID_SELECTALL = 17;

strCopy = "This text has been copied to the clipboard.";

var objIE = WScript.createObject("InternetExplorer.Application");
objIE.navigate("about:blank");
objIE.document.body.innerText = strCopy;
objIE.execWB(OLECMDID_SELECTALL, 0);
objIE.execWB(OLECMDID_COPY, 0);
objIE.quit();


execWBはホストIEを直接操作するので、表示中のページのゾーン設定の影響を受けない。
いちおう、これで動くけど、ただコピー文字列の指定方法(body.innerText 〜 OLECMDID_SELECTALL)はあんまりスマートじゃないなぁ。もうちょっと綺麗に書けそうな気もするけどとりあえず動いたから今日のところはいいや。