ardarimの日記 このページをアンテナに追加 RSSフィード

2008-02-01

[][] 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)はあんまりスマートじゃないなぁ。もうちょっと綺麗に書けそうな気もするけどとりあえず動いたから今日のところはいいや。

dd 2008/11/26 09:42 この方法は、TABがスペースに置き換わってしまうのが難点ですね。

ba-raindropba-raindrop 2010/10/08 15:29 素晴らしいです!
というわけで、タブがスペースに置き換わらない方法を考えてみました。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証