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 型。
■ テキストのコピー・テスト
テキストをコピー、 setText
この欄中の \0 は、\x00 (NULL文字) に置換してテストする。
テキストを得る(貼り付け)、 getText
字数
文字以外を与えるテスト:
setText(
eval()
)
↓
▽[テスト](JavaScriptの実行)
eval
コントロールの変数 ○. は、CBD.
* VBArray は、VBArray値.toArray() で、JavaScriptの配列に変換される。
* VBArray の作成には、= toVBArray( 値, 値, 値,.. ) という関数を用意した。
JavaScriptの配列からの変換は、= toVBArray( 配列 ) 。
■ ファイル
./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)等を修正。