2010/10/05

ActivePerlスクリプトをWindowsの「送る」メニューに加えてみた

Windows Vista以降だと簡単にExplorerからShift+右クリックで開くメニューに「パス名でコピー」が表示されますが、Windows XPではその機能がないようです。

カスタマイズをサポートするアプリケーションを使う事で加えることができるようだったのですが、汎用性がないので任意のスクリプトを右クリックメニューに加える方法を調べてみました。

Explorerの右クリックメニューに項目を加える

ユーティリティを使わずにコンテキストメニューに項目を加える方法について、ざっとみたところではDLLを HKEY_CLASSES_ROOT¥*¥shellex¥ContextMenuHandlers 当りに加えてあげるのが最近のやり方のようでした。

任意のメニュー項目を追加する事自体は可能

いろいろ調べてみると、かなり以前に 任意のメニュー項目を作成する方法をまとめたページがみつかりました。

Windows XPでもレジストリの HKEY_CLASSES_ROOT\*\shell\CopyPathname\command ("CopyPathname"は任意)というエントリを作成して、commandの値に C:\usr\bin\copypath.bat %1 にように適当なアプリケーションを指定するとメニューから、そのファイル名を引数としてアプリケーションを起動できることは確認しました。

今回採用した方法

レジストリをいろいろ編集するのは良さそうには思えなかったので、今回はより安全で簡単な方法として「送る(N)」(SendTo)メニューの中にショートカットを加える方法を使いました。

ActivePerlで作るパス名をクリップボードにコピーするスクリプト

これはActiveStateの Win32::Clipboardのサンプルコードそのままです。

第一引数の文字列をクリップボードにコピーするActivePerlスクリプト: C:\usr\bin\pathcp.pl

use Win32::Clipboard;
my $clip = Win32::Clipboard("$ARGV[0]")
さらにバッチファイルの作成

ファイルハンドラを追加しても直接「送る」(SendTo)メニューの中に配置する事はできなかったので、バッチファイルを作成しました。

pathcp.plを呼び出すためだけのバッチファイル: C:\usr\bin\pathcp.bat

"C:\usr\bin\pathcp.pl" "%1"

このpathcp.batファイルのショートカットをSendToフォルダに置けば完了です。

SendToフォルダは Documents and Settings の下にありますが、「ファイル名を指定して実行」から sendto と入力してもフォルダが直接開くので、そこにショートカットを置くのが楽そうです。

JScriptでパス名をクリップボードにコピーするスクリプトを作成みてみる

さすがにActivePerlが入っている環境はそうないと思うので、一般的なJScriptで作成してみました。

Googleで検索して参考にしたのは次のページです。→ 「 JScriptでファイルシステムとクリップボードにアクセス

JScript版のpathcp.jsスクリプト

var ie = new ActiveXObject('InternetExplorer.Application');
ie.Navigate('about:blank');
while(ie.Busy ) {
    WScript.Sleep(200);
}
var cb = ie.Document.parentWindow.clipboardData;
if (WScript.Arguments.length > 0) {
  cb.setData('Text', WScript.Arguments(0));
}

内部でIEを呼び出しているため確認のダイアログが出たり、セキュリティ設定のレベルによってうまく動かないこともあると思います。

手元の環境では画面の最背面にダイアログが表示されてみえい事で気がつかず、うまく実行することができない場合もありました。

ActivePerlは1x1ピクセルのウィンドウを開いてクリップボードにアクセスするための機能を持たせているので、IEを経由するよりも負荷は低そうです。

さいごに

コンテキストメニューの中をいろいろ編集できると良さそうですが、通常はDLLを使うようですね。 MSDNに関連する記事がありでしたが、そこまでやるなら適当なアプリケーションを入れたほうがよさそうです。

クリップボードにアクセスする機能はActivePerlが良さそうでした。 ただこれが使えるような環境は恵まれているのかもしれません。

今回の操作だけではコストに見合わない感じですが、操作手順を渡す時にアプリケーションからファイルを選択するよりも、コンテキストメニューからアプリケーションを選択させる方が誤操作の防止には役立ちそうです。

0 件のコメント: