コピーされたファイル名をクリップボードから取得          <TOP>


マイコンピュータやエクスプローラ等でコピーされたファイル名をクリップボードから取得します。

IsClipboardFormatAvalable 指定したフォーマットがクリップボードにあるかどうかの判定

OpenClipboard クリップボードをオープン

GetClipboardData クリップボードから指定のフォーマットのデータを検索

CloseClipboard クリップボードをクローズ

DragQueryFile ドラッグアンドドロップされたファイル名を取得

lstlen 指定された文字列のバイトまたは文字の長さを返す

 

左:エクスプローラでファイルを全選択しコピー    右:「一覧取得」ボタンによりクリップボードからのファイルを取得

 

'================================================================
'= コピーされたファイル名をクリップボードから取得
'=    (DragQueryFile.bas)
'================================================================
#include "Windows.bi"

' 指定したフォーマットがクリップボードにあるかどうか判定
Declare Function Api_IsClipboardFormatAvailable& Lib "user32" Alias "IsClipboardFormatAvailable" (ByVal wFormat&)

' クリップボードをオープン
Declare Function Api_OpenClipboard& Lib "user32" Alias "OpenClipboard" (ByVal hWnd&)

' クリップボードから指定フォーマットのデータを検索
Declare Function Api_GetClipboardData& Lib "user32" Alias "GetClipboardData" (ByVal wFormat&)

' クリップボードをクローズ
Declare Function Api_CloseClipboard& Lib "user32" Alias "CloseClipboard" ()

' ドラッグアンドドロップされたファイル名を取得
Declare Function Api_DragQueryFile& Lib "shell32" Alias "DragQueryFileA" (ByVal hDrop&, ByVal iFile&, ByVal lpszFile$, ByVal cch&)

' 指定された文字列のバイトまたは文字の長さを返す
Declare Function Api_lstrlen& Lib "Kernel32" Alias "lstrlenA" (ByVal lpString$)

#define CF_HDROP 15                     'HDROP型

Var Shared List1 As Object
Var Shared Button1 As Object
List1.Attach GetDlgItem("List1") : List1.SetFontSize 14
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14

'================================================================
'= クリップボードにCF_HDROP形式データがあるかどうかの確認
'================================================================
Declare Function ClipboardHasFiles() As Integer
Function ClipboardHasFiles() As Integer

    ClipboardHasFiles = (Api_IsClipboardFormatAvailable(CF_HDROP) > 0)
End Function

'================================================================
'= Chr$(0)を取り除く
'================================================================
Declare Function TrimNull(startstr As String) As String
Function TrimNull(startstr As String) As String
   TrimNull = Left$(startstr, Api_lstrLen(startstr))
End Function

'================================================================
'= クリップボードのCF_HDROP形式ファイルデータをListBoxに
'================================================================
Declare Sub ClipboardGetFiles()
Sub ClipboardGetFiles()
    Var hCBData As Long           'クリップボード内のデータハンドル
    Var numFiles As Long          'データの数
    Var cbBuffer As Long
    Var buffer As String
    Var cnt As Long
    Var Ret As Long

    List1.ResetContent

    'CF_HDROP形式ファイルデータがある場合
    If ClipboardHasFiles() Then

        'クリップボードオープン
        If Api_OpenClipboard(0) <> 0 Then

            'クリップボードデータのハンドルを取得
            hCBData = Api_GetClipboardData(CF_HDROP)

            '指定形式のデータが存在する場合
            If hCBData <> 0 Then

                'ドラッグドロップされたデータ数を取得
                numFiles = Api_DragQueryFile(hCBData, -1, ByVal 0, 0)

                For cnt = 0 To numFiles - 1
                    cbBuffer = Api_DragQueryFile(hCBData, cnt, ByVal 0, 0)

                    If cbBuffer > 0 Then
                        buffer = Space$(cbBuffer + 1)
                        cbBuffer = Len(buffer)
                  
                        'Bufferに入ったファイル名を整形(TrimNull)してListBoxに表示
                        If Api_DragQueryFile(hCBData, cnt, buffer, cbBuffer) > 0 Then
                            List1.AddString TrimNull(buffer)
                        End If
                    End If
                Next cnt
            End If

            'クリップボードクローズ
            Ret = Api_CloseClipboard
        End If
    End If
End Sub

'================================================================
'= エクスプローラ等でコピーされたファイル名をクリップボードから取得
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()

    ClipboardGetFiles
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End