キッズプレート、パスタおかわり

プログラミングやデジモノについてあれこれ
--.--.-- --:--|カテゴリ:スポンサー広告| コメント(-)

スポンサーサイト


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
2011.03.03 02:22|カテゴリ:DTPコメント(0)

InDesignのJavascriptでクリップボードのテキストを取得する


 さて、今日はめずらしくWindows版InDesignの小ネタ。普段アップルスクリプトを使っていると、

「クリップボードのテキスト取得? 何をいまさら言ってんの??」

 と、思ったりするんですがWindowsではこの処理をスクリプトで実現するのが意外と難しかったりします。

 さらにそれがWindows版InDesignのスクリプトとなると情報がなかなかでてきませぬ。当初は、

「Windows版InDesignならVBScript使えるしちゃちゃっと簡単にできちゃうんじゃね?」

 と思っていたら結構面倒、甘ちゃんすぎる浅はかな考えでした。Windowsの場合、基本的にスクリプトにはクリップボードを扱うインタフェースが無いようです。そこで何を利用するかと言うとインターネットエクスプローラになるわけですね。さすが、天下のIE様にはクリップボードを扱う権限が与えられています。

 ということで次のURLにて紹介されている手法をInDesignのJavascriptに落とし込んでみました。

WSH よりクリップボード、次の手

 InDesignのJavascriptからはapp.doScriptを使用してスクリプトをオンザフライで実行することが可能です。こいつを利用してVBScriptを実行。VBScript内でIEオブジェクトを作り出しクリップボードの値をテキストエリアのinnerText経由でいただくという、

「いやー、みんなよく考えるよね」

 という荒技。世間のみなさまのアイディアには脱帽でございます。

 当方Windows版InDesign CS3にて動作確認しました。ちょっともっさりなのはご愛嬌という事で(^^;

 注意点として「objIE.Quit()」の行が実行される前にスクリプトがこけるとCreateObjectで作ったIEのプロセスが終了せずに残ってしまい、さらに返事待ちなのかInDesignがフリーズしたような状態になります。この場合はプロセスマネージャを起動しIEのプロセスを終了させてください。IEのプロセスがなくなるとInDesignも操作ができるようになります。いやー、なにげにscriptArgsって値の受け取りに使えるんですね。今回のスクリプトを作ってみて初めて知りましたw

 おっと、最後に大事な事を忘れるところでした。結局IEに一度ペーストするという動きになっているのでIEが正規化処理でごにょごにょやっていると文字が変わっちゃうかもしれません。ここらへんのお話は例のごとく、ものかのさんのこちらの記事にてご確認ください。

Unicode正規化

 以下ソースです。


app.scriptArgs.setValue("myText","")
app.doScript(getCurrentText(),ScriptLanguage.visualBasic)
alert(app.scriptArgs.getValue("myText"))

function getCurrentText() {
myscript = "OLECMDID_PASTE = 13\n"
myscript = myscript + "set objIE = CreateObject(\"InternetExplorer.Application\")\n"
myscript = myscript + "objIE.Navigate(\"about:blank\")\n"
myscript = myscript + "Do While objIE.Busy\n"
myscript = myscript + "Loop\n"
myscript = myscript + "set myTextArea = objIE.document.createElement(\"textarea\")\n"
myscript = myscript + "call objIE.document.body.appendChild(myTextArea)\n"
myscript = myscript + "call myTextArea.Focus\n"
myscript = myscript + "myTextArea.innerText = \"\"\n"
myscript = myscript + "call objIE.ExecWB(OLECMDID_PASTE, 0)\n"
myscript = myscript + "myValue = myTextArea.innerText\n"
myscript = myscript + "objIE.Quit()\n"
myscript = myscript + "app.scriptArgs.SetValue \"myText\",myValue"
return myscript
}
コメントの投稿












管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL

プロフィール

ひらくん Author:ひらくん
どもども、ひらんくんどす。
日々まったり過ごしております。
仕事はDTP関連のスプリクト&アプリケーション開発。
Follow happyscript on Twitter

ブログ内検索



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。