ClipboardData.dll ClipboardData.Agent {C85D2198-4023-459A-A865-C59941132DFB} 文字列をクリップボードに送る、または、クリップボードにある文字列を得る。 HTA の時は、window.clipboardData オブジェクトが使えるので不要だが、 WSH で、IE を操って、それをしようとすると、確認のダイアログが出たりし 面倒、あるいは使用不能であったりするので、その代用として。 ■ 使い方 ○ = new ActiveXObject("ClipboardData.Agent") ○.setText( テキスト ) クリップボードに、テキストをコピーする。 テキスト = ○.getText() クリップボードにあるテキストを得る。 クリップボードに、ファイルやフォルダがある時は、そのパスを返す。 (複数ある時は、改行区切り。改行は \n の1文字。) テキストも、ファイルもない時は、空文字を返す。 ※ setText() で、文字列以外を渡した場合は、 文字列に変換してコピーする。ただし、JavaScript の表現とは異なる。 ( 例えば、true, false は、"True", "False" と頭が大文字に、 NaN は "NAN" 、Infinity は "INF" などとなる。 が、object 類は、JScript側の文字表現と同様になるようなので、 外に渡せない値は、多分、JScript側で文字列化されているのだろう。) また、引数無しの時は、クリップボードを空にする。 ( undefined値と null値は、空文字に変換されてコピーされ、 一応、引数なしとは異なる。)
■ バイト単位のデータ用メソッド ○.setData( VBArray, format ) クリップボードにデータを、バイト単位でセットする。 引数は、0 ~ 255 の数値の VB の配列。 ( VBArray以外のものを渡した場合は、.setText() で処理する。) 2つ目引数 format は、データ形式を示す数値。 (途中で変換されるので、数値化されてない文字列の数字でも可。) VBArray = ○.getData( format ) クリップボードのデータを、バイト毎の数の配列として得る。 引数 format は、データ形式を示す数値。 その形式のデータが無い時の戻り値は、未定義値(undefined)。 if( 戻り値 !=null ) JSの配列 = 戻り値.toArray(); とすれば、 JavaScriptで扱える配列に変換される。( VBArray は、JavaScriptの オブジェクトとは異質で、if( 戻り値 ) では判断できない。→*)
* 条件(真偽)判断の文脈で、VBArray値は、偽(false)になる。が、値==false ではない。 typeof VBArray値 =="unknown" 、VBArray値.constructor == VBArray である。
データ形式を示す数値は例えば、文字列の UNICODE は 13 、Shift_JIS(ANSI) は 1 。 文字 a を 1 文字コピーすると、UNICODE では 97,0,0,0 で、ANSI では 97,0 になる。UNICODE では、1 文字を表す 2 バイトの順序が逆になっている。 また、どちらも末尾に NULL 文字が必要で、UNICODE ならそれも 2バイト。 1つのデータは、複数の形式で取得する事が出来て、文字列なら、UNICODE でも Shift_JIS(ANSI) でも得られる。
コントロール(DLL)側と、配列の値を受け渡しするには、JavaScriptの配列は使えず、 VBScriptの配列(VBArray, SafeArray)を使わなくてはならない。 取得する(戻り値に受け取る)方では、VBArray値の JavaScript配列への変換は、 戻り値.toArray() と、JScript中で可能で、簡単に出来る。 問題は、渡す方で、VBArray の作成が必要だが、JScriptでは出来ないので、 VBScriptの中の関数を呼び出さなくてはならない。 次の例では、 toVBArray( JavaScriptの配列 ); で、VBArray に変換、 あるいは、 toVBArray( 値, 値, 値,.. ); で、VBArray を作成できるようにする。 例えば、○.setData( toVBArray( 97,98,99,0 ), 1 ) で、"abc" をコピー。
<script type="text/vbscript"> Dim vbAry01() ' VBの配列(VBArray)、これを渡す値に使用する。 Sub reDim_vbAry01( len ) ' VB配列の再割り当て。引数は、配列の長さ。 ReDim vbAry01( len -1 ) ' length -1 =upperbound, 配列末尾のインデックス End Sub Sub setVal_vbAry01( num, value ) ' 配列の要素に値を入れる。num: 要素のindex , value: 値 vbAry01(num) = value End Sub </script> <script type="text/javascript"> function toVBArray( arg1 ){ // 複数の引数を、または JavaScriptの配列を、VBの配列に変換して返す。 var ary, len = arguments.length if( len==0 ) ary = [] else if( arg1 && arg1.constructor==Array ) ary = arg1 else{ ary = [] for(var i=0; i< len; i++) ary[i] = arguments[i] } len = ary.length reDim_vbAry01( len ) for(var i=0; i< len; i++) setVal_vbAry01( i, ary[i] ) return vbAry01 } </script>
( 上の vbAry01 はグローバル変数で、JavaScript側からも見えるのだが、常に 同じ一つを参照しているのではなく、複数存在し得るらしい。 JavaScript の変数に代入しておくと、次に vbAry01 を新しくしても、 それとは、異なるものとして在り続けるようだ。)
HTA や (WSHの) WSF ファイルは、上のように異なる言語を書き込めるが、 それが出来ない単独の JS ファイルでは、 WSC ファイルを使う(→同梱 toVBArray.wsc 参照) か、 あるいは次のように MSScriptControl とかいうものを使う方法がある。
var toVBArray //使用例: VB配列 = toVBArray( 1,2,3 ); または = toVBArray( [1,2,3] ); ;(function(){ var scrCtl = new ActiveXObject("MSScriptControl.ScriptControl") scrCtl.Language = "VBScript" var scrModule = scrCtl.Modules.Item(1) scrModule.AddCode( "Dim vbAry()\n" ) toVBArray = function( arg1 ){ var ary, len = arguments.length if( len==0 ) ary = [] else if( arg1 && arg1.constructor==Array ) ary = arg1 else{ ary = [] for(var i=0; i< len; i++) ary[i] = arguments[i] } len = ary.length scrModule.AddCode( "ReDim vbAry( "+ (len -1) +" )\n" ) for(var i=0; i< len; i++) scrModule.AddCode( "vbAry("+i+") = "+ ary[i] +"\n" ) return scrModule.CodeObject.vbAry } })()
■ その他のメソッド ▼ フォーマット、 真偽 = ○.isAvailable( format ) 引数に指定した形式は、現在のクリップボード内容に、有効かどうか。 リスト = ○.getFormatList() 現在のクリップボード内容の形式のリストを返す。 リストは、数字をカンマ区切りにした文字列である。 ( 戻り値.split(",") とすれば配列になる。) 名前 = ○.getConstName( format ) 標準的なデータ形式(フォーマット)の定数名を返す。 名前 = ○.getFormatName( format ) 登録されているデータ形式の名前を返す。 format = ○.registerFormat( 名前 ) フォーマットの登録。既に登録されているフォーマットなら、その フォーマットを表す数値が返る。 ▼ 他の情報 サイズ = ○.getSize( format ) 現在のクリップボード内容の、指定形式でのサイズ (単位はバイト)。 テキストのサイズは、終端を示すNULL文字の分、常に余分に出る。 format 1: CF_TEXT では、1 バイト。13: CF_UNICODETEXT では、2 バイト。 空文字が入っている時も、サイズは 0 でなく、この分の値が返される。 Number = ○.getSqncNum() クリップボードのシーケンス番号( 内容が変更されるとインクリメント されるとある。) ▼ ファイル リスト = ○.getPathList() クリップボードに、ファイルやフォルダが入っている時に、 そのパスを、改行(\n)区切りで返す。 ( 戻り値.split("\n") とすれば配列になる。) 内容が異なる場合は、空文字を返す。 ○.setFiles( ファイルリスト, フラグ ) ファイルを、コピー(エクスプローラから貼り付けできる)状態にセットする。 ファイルリスト: 文字列、ファイルパス、 複数のパスは、改行区切りとし、改行は1文字で。 フラグ: 1 はコピー、2 は切り取り。 ( 4 は、ショートカットの貼り付けが可能になるらしいが効かない。) ▼ その他 ○.clearData() クリップボードを空にする。 ○.setText_bstr( 文字列 ) テキストのコピー、テスト用。引数が、BSTR 型。

■ 登録 / 解除
  (登録) regsvr32     (解除) regsvr32 /u
( 場所に注意、 にファイルが在る事が登録される。)

■ テキストのコピー・テスト
テキストをコピー、 setText

この欄中の \0 は、\x00 (NULL文字) に置換してテストする。

テキストを得る(貼り付け)、 getText 字数
文字以外を与えるテスト: setText( eval() )

■ データのコピー・テスト
データをコピー、 setData(array, format) format(数):
  (数 0-255 をカンマ区切りで入力)
データを得る、 getData(format) format(数):
(結果、上段 10進、中段 16進、下段 ascii)

■ その他のテスト
現在の内容のフォーマット(形式)リスト
形式リストに名前を加えて表示
現在の内容に有効な形式かどうか format(数):
現在の内容サイズ format(数): バイト
クリップボードを空にする
SequenceNumber
ファイルのパス


▽[テスト](JavaScriptの実行)

■ ファイル ./ClipboardData.dll 当該のもの ./ClipboardData/ ソースのフォルダ Unit1.pas 作業部分 ClipboardData.dpr プロジェクトファイル ClipboardData_TLB.pas タイプライブラリ ClipboardData.idl タイプライブラリ(Interface Definition ..) ./readme.hta このファイル ./convertArray.wsc VBArrayの使用の為の参考用。 ./test.js 同。 ------------------------------------------------------------- 2011/1/7 作成 2011/1/11 複数のファイルパスを繋ぐ、改行の挿入位置の間違いを修正。 2011/1/14 この説明のファイルを修正。 2011/1/26 \0(NULL文字)がある所で、文字列が途切れてしまわないように修正。 引数に、null を渡した時、エラーにならないように修正。 データのコピー等のメソッドを追加、他。 2011/2/2 INT型になっていた format などの引数を、UINT に変更。 2011/2/24 追加修正。 2011/3/14 追加修正。 2011/3/26 このファイル(readme.hta)等を修正。