その買うを、もっとハッピーに。|ハピタス

右クリックでパスをコピーするVBScript

よく右クリックのメニューにパスをコピーする機能を追加してくれるソフトがありますよね。
無くてはならない機能で、よく使ってました。Window 7は標準で実装されてるらしいんですが。。僕はまだXPです。
まぁそれで、右クリックでパスをコピーするのをVBScriptでやってしまおうということです。
VBS本体とレジストリを使用します。

VBS本体

'CopyPathToClipBoard.vbs
Option Explicit

Dim objArgs

Set objArgs = WScript.Arguments

If objArgs.Count = 0 Then WScript.Quit
ClipBoard_SetData objArgs(0)

Sub ClipBoard_SetData(MyString)

    Const GHND = &H42
    Const CF_TEXT = 1
    Const MAXSIZE = 4096
    Dim hGlobalMemory, lpGlobalMemory
    Dim hClipMemory, X
    Dim GlobalUnlock, GlobalLock, GlobalAlloc
    Dim CloseClipboard, OpenClipboard
    Dim EmptyClipboard, lstrcpy, SetClipboardData

    Set GlobalUnlock = CreateObject("SfcMini.DynaCall")
    GlobalUnlock.Declare "kernel32","GlobalUnlock"
    Set GlobalLock = CreateObject("SfcMini.DynaCall")
    GlobalLock.Declare "kernel32","GlobalLock"
    Set GlobalAlloc = CreateObject("SfcMini.DynaCall")
    GlobalAlloc.Declare "kernel32","GlobalAlloc"
    Set CloseClipboard = CreateObject("SfcMini.DynaCall")
    CloseClipboard.Declare "User32","CloseClipboard"
    Set OpenClipboard = CreateObject("SfcMini.DynaCall")
    OpenClipboard.Declare "User32","OpenClipboard"
    Set EmptyClipboard = CreateObject("SfcMini.DynaCall")
    EmptyClipboard.Declare "User32","EmptyClipboard"
    Set lstrcpy = CreateObject("SfcMini.DynaCall")
    lstrcpy.Declare "kernel32","lstrcpy"
    Set SetClipboardData = CreateObject("SfcMini.DynaCall")
    SetClipboardData.Declare "User32","SetClipboardData"

    hGlobalMemory = GlobalAlloc(GHND, LenB(MyString) + 1)
    lpGlobalMemory = GlobalLock(hGlobalMemory)
    lpGlobalMemory = lstrcpy(lpGlobalMemory, MyString)

    If GlobalUnlock(hGlobalMemory) <> 0 Then
        MsgBox "メモリのロックを解除できません。処理が失敗しました。"
        If CloseClipboard() = 0 Then
            MsgBox "クリップボードを閉じることができません。"
        End If
        Exit Sub
    End If

    If OpenClipboard(0) = 0 Then
        MsgBox "クリップボードを開くことができません。処理が失敗しました。"
        Exit Sub
    End If

    X = EmptyClipboard()
    hClipMemory = SetClipboardData(CF_TEXT, hGlobalMemory)

    If CloseClipboard() = 0 Then
        MsgBox "クリップボードを閉じることができません。"
    End If

End Sub


クリップボードへ文字列をコピーする部分のプログラムは、殆ど某MSのサンプルです(笑)
多少変えたりVBS用に使えるようにしました。VBSじゃGoToとか使えないし。
あと、クリップボードへ文字列をコピーするロジックは他にもIEオブジェクトを利用する方法などありますが、
今回はWindows APIを使ってコピーしてます。IEだと重いし。。
標準VBSではWindows APIは使えませんので、いつもの「SFC mini」を使ってます。

レジストリ

Windows Registry Editor Version 5.00
;CopyPathToClipBoard.reg

[HKEY_CLASSES_ROOT\Directory\shell\PathCoppin] 
@="ぱすこっぴん(&Z)" 

[HKEY_CLASSES_ROOT\Directory\shell\PathCoppin\command] 
@="wscript.exe \"C:\\CopyPathToClipBoard.vbs\" \"%1\""

[HKEY_CLASSES_ROOT\*\shell\PathCoppin]
@="ぱすこっぴん(&Z)" 

[HKEY_CLASSES_ROOT\*\shell\PathCoppin\command]
@="wscript.exe \"C:\\CopyPathToClipBoard.vbs\" \"%1\""


VBSファイルにコマンドライン引数を渡すためにレジストリにキーを作成、エントリに値を入れます。
パスはVBSファイルが置いてある場所を指定します。
また、階層の区切りの「\」などの特殊文字エスケープする必要があります。


レジストリへ登録されると、ファイルかフォルダを右クリックした時、こんなメニューになると思います。


右クリックメニュー

窓使いの憂鬱


ここが肝というか…(笑)わざわざVBSファイルを使ってパスをコピーする意味があるというか…。。
ソフトの場合、メニューのショートカットが変更出来ないので、
窓使いの憂鬱を使って一連のキー操作を作る場合、うまくいかない場合があるんですよね。
他の項目とショートカットが被ったりなどで。
なので、前項のレジストリ登録で(&Z)としているのは、あまり被らなそうだから(&Z)にしてるんです。
もし色んなソフトをインストールしていってメニュー項目が増えて被ってしまっても、
レジストリをちょこっと変更すればよいだけですし。

#Explorer用
window Explorer /explorer\.exe/ : Global
key W-*c = Apps z


とかやればWin+Cでパスがコピー出来ます。



Windows自動処理のためのWSHプログラミングガイド

Windows自動処理のためのWSHプログラミングガイド