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 素晴らしいです!
というわけで、タブがスペースに置き換わらない方法を考えてみました。

stst 2014/10/07 11:27 素晴らしい!TABのない場合に利用させて頂きました。
例えば、URLとか----。

stst 2014/10/17 07:31 Win8では問題なく動作するのですが、Vista sp2 32bitでは
不安定です。再起動後に動作させると、必ず1回はエラーと
なり、2回目で動作する事が多いです。また、Cscriptでは
動作しません。

stst 2014/10/19 18:27 Vista sp2 32bitでは処理が遅いため、再起動後やCscript
ではエラーとなるようです。objIE.navigate("about:blank");の
あとにWScript.sleep(1000);を追加して1秒待機させると問題なく
動作しました。

stst 2014/11/03 17:58 本文はコピーについてでしたが、取得する場合は下記のようになります。strxxx に取得するとします。Jscriptですが、IEの設定を変えずにうまく行きました。これでWSHでクリップボードに完全にアクセスする事ができます。
var OLECMDID_PASTE = 13;
var internetExplorer = new ActiveXObject ('InternetExplorer.Application');
internetExplorer.Navigate ('about:blank');
while (internetExplorer.Busy)
WScript.Sleep (10);
var _textarea = internetExplorer.document.createElement ("textarea");
internetExplorer.document.body.appendChild (_textarea);
_textarea.focus ();
var clipboard = new Clipboard ();
var strxxx = clipboard.getText ();
internetExplorer.Quit ();

function Clipboard ()
{
this.getText = function ()
{
_textarea.innerText = "";
internetExplorer.execWB (OLECMDID_PASTE, 0);
return _textarea.innerText;
};
return this;
}

stst 2014/11/04 07:01 より短いコードでうまくゆきました。コピーと取得を別々に利用する場合に便利です。それにしても、もっと短いコードはないでしょうか。取得の場合が長すぎますね。
var OLECMDID_PASTE = 13;
var objIE = new ActiveXObject ('InternetExplorer.Application');
objIE.Navigate ('about:blank');
while (objIE.Busy)
WScript.Sleep (10);
var _textarea = objIE.document.createElement ("textarea");
objIE.document.body.appendChild (_textarea);
_textarea.focus ();
_textarea.innerText = "";
objIE.execWB (OLECMDID_PASTE, 0);
var stxxx = _textarea.innerText;
objIE.Quit ();

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


画像認証