2009年06月14日


エクスプローラで選択されたファイルをテキスト形式でクリップボードにコピーして利用する(名前 or フルパス)

最も簡単なのは、「送る」に設定されたアプリケーションにエクスプローラ
で選択されたファイルのリストがフルパスで引数として渡されるのを利用する事です。
(コマンドプロンプト文字列の制限)

これを利用すれば、WSH(VBScript)を「送る」に置くだけで、
ファイルのリストやフルパスのリストを取得する事ができます
ブラウザでダウンロード
' クリップボードとSHIFTキー用
' ※ HTA 等では直接 window.clipboardData より実行
' ※ するように書き換える必要があります
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Navigate("about:blank")
Do While objIE.Busy
	' 100 ミリ秒
	Wscript.Sleep 100
Loop

' SHIFT キーを感知する為の処理
Dim isShift

objIE.document.getElementsByTagName("BODY")(0).innerHTML = _
"<INPUT id=ret><INPUT id=bt type=button " & _
" onClick='document.getElementById(""ret"").value=window.event.shiftKey'>"
objIE.document.getElementById("bt").click
if Ucase(objIE.document.getElementById("ret").value) = "TRUE" then
	isShift = True
else
	isShift = False
end if

' データ作成
str = ""
For I = 0 to Wscript.Arguments.Count-1
	if isShift then
		' SHIFT キーが押されていたらフルパス
		str = str & Wscript.Arguments(I) & vbCrLf
	else
		' SHIFT キーが押されていなければファイル名のみ
		aData = Split( Wscript.Arguments(I), "\" )
		str = str & aData(Ubound(aData)) & vbCrLf
	end if
Next

' クリップボードへコピー
Call objIE.document.parentWindow.clipboardData.SetData( "Text", str )
objIE.Quit

クリップボードのコピー部分をコマンドラインのアプリケーション
を使って実行する方法は以下を参照して下さい。
IE をいまいち信用できない人用です。

■ VBS : ファイルリストをクリップボードへコピーVBS : ファイルのフルパスをクリップボードへ

最近は、IEがクリップボードへの貼り付けに許可を求めるので、
信頼するサイトへ "about:blank" を登録して、
( https のチェックボックスのチェックは外します )
スクリプトのセクションで、クリツプボードへの貼り付けを「有効」にします

しかし、このままでは大量のファイルの場合、コマンドラインの長さ
制限でエラーになってしまうので、いったんエクスプローラから「コピー」
を実行し、それをあらためてテキスト形式でクリップボードへ転送しな
おす VB.NET アプリケーションを以下に示します
( これは、コマンドラインからビルドした Windows アプリケーションです )
ブラウザでダウンロード
Imports System.Collections.Specialized

Module MyModule

' ********************************************************
' * 実行
' ********************************************************
Sub Main()

	' 引数による処理タイプの決定
	' name : ファイル名のみ
	' path : フルパス
	Dim argv As String()
	argv = System.Environment.GetCommandLineArgs()
	Dim ActType As String
	If argv.Length = 1 Then
		ActType = "name"
	Else
		' name または path
		ActType = argv(1)
	End If
	' SHIFT キーを感知できた場合は処理を反転する
	If My.Computer.Keyboard.ShiftKeyDown Then
		If ActType = "name" Then
			ActType = "path"
		else
			ActType = "name"
		End If
	End If

	Dim FileList As StringCollection
	Dim FilePath As String
	Dim ClipString As String = ""
	Dim delimStr As String = "\"
	Dim delimiter As Char() = delimStr.ToCharArray()
	Dim aData As String()

	' クリップボードにファイルのデータがあった場合
	If My.Computer.Clipboard.ContainsFileDropList() Then
		'データを取得する
		FileList = My.Computer.Clipboard.GetFileDropList()
		'取得したファイル名を列挙する
		For Each FilePath In FileList
			If ActType = "path" Then
				ClipString += FilePath + ControlChars.CrLf
			Else
				aData = FilePath.Split(delimiter)
				ClipString += aData(aData.Length - 1) + ControlChars.CrLf
			End If
		Next

		My.Computer.Clipboard.SetText(ClipString)
	End If


End Sub

End Module

使い勝手としては、デスクトップにショートカットを作成し、
ショートカットキーを設定すればエクスプローラからすぐ使えます。
( その場合は、内部の SHIFT キー反転は使えません )

「送る」に入れると無条件に選択ファイルの処理をしようとするので
エラーになってしまいます。Shell 拡張を使えば良いのですが、
だんだんメンテナンスが一般的ではなくなってしまうので今回は割愛します。


さらに、Visual Studio でビルドしたい場合は、ApplicationEvents.vb 
を使用して、擬似的にフォームを使わないようにするのが簡単です
Imports System.Collections.Specialized

Namespace My

	Partial Friend Class MyApplication

		' ********************************************************
		' スタートアップ
		' ********************************************************
		Private Sub MyApplication_Startup(ByVal sender As Object, _
		ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) _
		Handles Me.Startup

			' 引数による処理タイプの決定
			' name : ファイル名のみ
			' path : フルパス
			Dim argv As String()
			argv = System.Environment.GetCommandLineArgs()
			Dim ActType As String
			If argv.Length = 1 Then
				ActType = "name"
			Else
				' name または path
				ActType = argv(1)
			End If
			' SHIFT キーを感知できた場合は処理を反転する
			If My.Computer.Keyboard.ShiftKeyDown Then
				If ActType = "name" Then
					ActType = "path"
				End If
				If ActType = "path" Then
					ActType = "name"
				End If
			End If

			Dim FileList As StringCollection
			Dim FilePath As String
			Dim ClipString As String = ""
			Dim delimStr As String = "\"
			Dim delimiter As Char() = delimStr.ToCharArray()
			Dim aData As String()

			' フォームを使用せずに終了する
			e.Cancel = True

			' クリップボードにファイルのデータがあった場合
			If Clipboard.ContainsFileDropList() Then
				'データを取得する
				FileList = Clipboard.GetFileDropList()
				'取得したファイル名を列挙する
				For Each FilePath In FileList
					If ActType = "path" Then
						ClipString += FilePath + ControlChars.CrLf
					Else
						aData = FilePath.Split(delimiter)
						ClipString += aData(aData.Length - 1) + ControlChars.CrLf
					End If
				Next

				Clipboard.SetText(ClipString)
			End If

		End Sub
	End Class

End Namespace


posted by at 13:08 | 古い記事(保存用) | このブログの読者になる | 更新情報をチェックする