C# で作成した、アイコンを投げ入れると、パスを通知する ActiveX 用のコントロール。
.NET の ActiveX 用コントロール の作成法については
メモ に。
■ インストール
.NET が必要。(バージョン、3.5 でコンパイルした。)
使用するには、dll ファイルを、
GAC (グローバル アセンブリ キャッシュ)に インストールする事と、
レジストリに(型を)登録する事、その2つの作業をしないとならないが、
Windows 7 以降は、Visual Studio(Microsoftの開発用ソフト)を入れてないと、
GAC へのインストールが出来ないようである。
gacutil.exe /i iconPit.dll
グローバル アセンブリ キャッシュ(GAC)に、インストールする。(管理者権限で)
そのキャッシュ(フォルダ)は、%windir%\assembly\
(勿論、上のコマンドラインで、exe も iconPit.dll も、そのパスが必要。)
gacutil.exe は、Visual Studio をインストールすると、
%ProgramFiles%\Microsoft SDKs\Windows\ の下の何処かの bin\ フォルダに
ある。 Visual Studio (か VC++)に付属するコマンド プロンプトを使う
なら、パスが通っているので探す必要ない。
Windows XP 等では、gacutil.exe を使わず、エクスプローラで、assembly
フォルダを開き、dll をドラッグ&ドロップすれば、インストール出来た。
Windows 7 以降は、そうしても「アクセスが拒否されました」などと出て、
断られる。(管理者としてエクスプローラ..でも。)
regasm.exe iconPit.dll
レジストリへの型の登録。(パスは必要)
regasm.exe は、%windir%\Microsoft.NET\Framework\ の下(多分、v で始まる
名のフォルダの中)にある。
この登録と、GACへのインストールと、どちらから実行すべきかの順序は、
問われない様である。
アンインストールと、登録解除は、
gacutil.exe /u iconPit
アンインストール時には、dll の拡張子もパスも付けない。
GAC(assemblyフォルダ)中の名前を指定するようである。
または、エクスプローラで、assembly フォルダ中の iconPit を、右クリックし、
メニューから、アンインストールをクリックする。
regasm.exe /u iconPit.dll
型の登録の解除。/u または /unregster
インストール後、多分この HTAは、(更新でなく)一旦閉じないと、反映されないかも知れない。
コンパイルし直した場合、GAC へ再インストールしないと、反映されない。
また使用側(このHTAなど)も、一度、閉じる必要ある。
その他、コンパイルなどについては、
メモ の方を参照のこと。
■ テスト
↑アイコンを投入。
(※ 選択したアイコン中に、ゴミ箱や、デスクトップ、マイ ドキュメントなどの
オブジェクトが混ざっていると、ドロップ出来ない。)
(以下では、[Ctrl] か [Shift] が伴う時には、追加になるようにした。)
■ 使い方
<object id="○"
classid="clsid:CFCAF3FD-32C4-43C0-8B4C-3317B966D063"
width="160" height="120" style="border: solid 4px #404040;" >
<param name="BackColor" value="255, 255, 255" >
<param name="ForeColor" value="Black" >
<param name="Font" value="MS ゴシック, 18" >
<param name="pText" value="アイコンを 投げ入れると パスを通知する。" >
<param name="pTextAlign" value="1" >
</object>
( この例は、上の実際とは異なる。)
BackColor は背景色、ForeColor は文字色、Font はフォントの設定で、これらは、
デフォルトで備わっているプロパティで、PARAM 要素で、初期値を与える事が出来る。
しかし、後からスクリプトでは、アクセス出来ないようだ。
上の、pText 等は、プログラムで付け加えた公開のプロパティであり、
スクリプトでも変更出来る。( 区別の為、先頭に p を付けてみた。)
BackColor, ForeColor の PARAM 要素の value の書き方は、
色名 (文字の大小区別なし)、1つの数値、3つまたは4つのカンマ区切りの数値、などが
あるようで、3つ区切りの数は、RGB の各指定。4つ区切りは、先頭が アルファ(透明度)
の指定。 数値1つの場合、4 バイト符号ありで、先頭バイトが、 255 以外なら
透明度の指定になる。
Font には、FontFamily 名。または、カンマに続けてサイズ。サイズには、単位を付ける事も
出来る様で、px pt world など。それ以上の例えば、太字などスタイルの指定は、不明。
以下で、○ は、上の object 要素の id
▼ アイコンなどがドロップされた時の通知を受け取る関数
function ○::onDropFile( paths, iModKey ){
// ファイルのアイコンを落とした時の通知。
// 引数 paths (arguments[0]) は、パスの文字列であるが、
// 複数の場合、改行( \n の1文字)で 区切ってあり、
// 引数.split("\n") で、配列になる。
//
// iModKey (arguments[1]) は、マウスボタンと、修飾キーを表し、
// 左マウスボタン: 1, 右マウスボタン: 2,
// Shift: 16, Ctrl: 32, Alt: 64 、複数のキーなら和(ビットOR)。
}
function ○::onDropText( text, iModKeys ){
// 選択されたテキストを、ドラッグして落とした時に、通知。
// 一つ目引数は、そのテキスト。2つ目は、修飾キー(同上)。
}
function ○::onDropLink( text, iModKeys ){
// ブラウザのリンクを、ドラッグして落とした時に、通知。
// ただし、IE のリンクは落とせない (多分セキュリティ絡み?)。
}
function ○::onClick( iModKeys ){
// コントロールをクリックした時に、通知。
// 左クリックなら 1、右クリック 2、中ボタン 4 。
// 修飾キーは、Shift: 16, Ctrl: 32, Alt: 64, のビット和。
// キーによるクリックの場合は、下から2バイト目に、キーコードを入れてあり、
// iModKeys >> 8 とした場合、0 でなく、
// [Enter]キー 13 、[Space] 32 、[App] 93 、になる。
// キーフォーカスについて。ブラウザのこの要素がフォーカスされても、
// 中のコントロールが、フォーカスされない事がよくある。この辺りは、
// よく判らない。
}
function ○::onDoubleClick( iModKeys ){
// ダブルクリック時。(この場合、直前に、onClick あり。)
}
コントロールが無効の時や、インストールされてない場合、
これら 要素::名前 の書き方の function が存在していると、
「クラスはオートメーションをサポートしていません。」という、エラーが起きる。
エラーが出るのを避けるには、これらの関数定義の部分全体を、関数の中に置いて、
コントロールが有効である場合のみ、その関数を呼び出す。
( :: 付きの関数に、スコープは関係なく、関数の中に入れても問題ない。)
有効であるかは、if( 要素.Enabled ) ... などで判断する。
( このコントロールでは、無効時に、window.要素id が undefined になる、
object要素が無くなってしまう、という事はないようである。)
▼ (作成した) スクリプト用のプロパティ、メソッド
○.pText : プロパティ、表示テキスト。
( 改行は、スクリプト言語によるが、上の Box 中では \n を。)
○.pTextAlign : プロパティ、表示テキストの配置法。
1: TopLeft, 2: TopCenter, 4: TopRight, 16: MiddleLeft, 32: MiddleCenter,
64: MiddleRight, 256: BottomLeft, 512: BottomCenter, 1024: BottomRight
○.setFont( FontFamily名, float サイズ, int スタイル, int 単位 )
フォントの変更。
スタイル、 0: Regular, 1: Bold, 2: Italic, 4: Underline, 8: Strikeout
単位は、サイズの単位で、 0: World ワールド座標系,
1: Display 表示デバイスによる, 2: Pixel,
3: Point プリンタ ポイント(1/72インチ), 4: Inch,
5: Document ドキュメント単位(1/300インチ), 6: Millimeter,
○.setBkRGB( RGB値 ) 0x
○.setFrRGB( RGB値 ) 0x
背景、文字色の変更。0 は 黒、0xFFFFFF は 白。( アルファは不透明に固定。)
○.pBackColor , ○.pForeColor
プロパティ、背景/文字色の ARGB 値。
A は、アルファ(透明度)で、0 が透明、0xFF(255)が不透明。
A = 値 & 0xFF000000; R = 値 & 0xFF0000; G = 値 & 0xFF00; B = 値 & 0xFF;
設定で、不透明にするには、 = 0xFF000000 | RGB値;
ビット演算しないで、0x80000000 以上の値を渡すと、32 ビットを越える数が
向こうへ渡されてしまうので、エラー(オーバーフロー)になる。
負数で渡すなら問題ない。不透明の、白は -1 、黒は -16777216 。
○.pSignalBackColor , ○.pSignalForeColor
背景/文字の一時的変更時の色、RGB 値。面倒なので、アルファ値無し(不透明に固定)。
キーフォーカス時と、ファイルなどをドロップした時に、色を一時的に変更する。
○.pInfoInterval
プロパティ、数値。ファイルなどをドロップした後、背景/文字色を一時的に
変更する時間の指定。ミリ秒単位。 0 なら変更なし。
○.setImageFile( パス )
画像の表示。パスは、.bmp .jpg 等のファイルパス。
他、ソースを参照。(コンストラクタ以外の public なメンバーは、ほぼ、こちらから使用可。)
※ HTML や フレームのある HTA で起きる問題などは、Delphi 版の 同コントロール
の説明に。
■ [テスト]
(スクリプトの実行)
上の OBJECT 要素の (IEが生成した) outerHTML
2011/04/14 初出
2011/07/29 通知の引数の2つ目に、修飾キーの状態を加える。
テキストなどのドロップと、Clickや キー押下も、通知するようにした。
2011/08/05 上の修飾キーの状態などを表す数値などを変更。
2012/02/10 通知するパスの最後にいつも改行(\n)が付いてしまっていたのを直した。
2016/12, 2017/04 このファイル中の説明と、スクリプトを一部修正。