ドラッグ&ドロップ関連2015.02.08
ドラッグ&ドロップを実装するために使用するWin32APIをまとめました。
本ページのWin32API関数の宣言はExcel2003以前には対応していません。
※Excel2007に対応させるためには、コード内のPtrSafeキーワードを削除します。
ポイント
・GetActiveWindow関数(Win32API)
・SetWindowLong関数(Win32API)
・CallWindowProc関数(Win32API)
・DragAcceptFiles関数(Win32API)
・DragQueryFile関数(Win32API)
・DragFinish関数(Win32API)
GetActiveWindow関数
[詳細]
SetWindowLong関数
指定されたウィンドウの属性を変更する。msdn[詳細]
【宣言】
Declare PtrSafe Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" ( _ ByVal hwnd As Long, _ ByVal nIndex As Long, _ ByVal dwNewLong As Long) As Long
hwnd・・・ウィンドウのハンドルを指定。クラスも間接的に指定したことになる。
nIndex・・・設定する値のオフセット。ウィンドウプロシージャのアドレスを書き換える場合はGWL_WNDPROC = -4 を指定。
dwNewLong・・・新しく設定する値を指定。
【戻り値】
関数が成功すると、変更前の値が返る。関数が失敗すると、0 が返る。
サンプルコード
CallWindowProc関数
指定されたウィンドウプロシージャに、メッセージ情報を渡す。msdn[詳細]
【宣言】
Declare PtrSafe Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" ( _ ByVal lpPrevWndFunc As Long, _ ByVal hwnd As Long, _ ByVal Msg As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long
lpPrevWndFunc・・・元のウィンドウプロシージャへのポインタを指定。
hWnd・・・メッセージを受信するウィンドウのハンドルを指定。
Msg・・・メッセージを指定。ドロップのメッセージはWM_DROPFILES = &H233
wParam・・・メッセージの追加情報を指定。このパラメータの意味は、Msg の値によって異なる。
lParam・・・メッセージの追加情報を指定。このパラメータの意味は、Msg の値によって異なる。
【戻り値】
メッセージ処理の結果が返ります。戻り値の意味は、送信されたメッセージによって異なる。
サンプルコード
DragAcceptFiles関数
ウィンドウがファイルのドラッグ&ドロップを受け入れるかどうかを設定する。msdn[詳細]
【宣言】
Declare PtrSafe Sub DragAcceptFiles Lib "shell32.dll" ( _ ByVal hwnd As Long, _ ByVal fAccept As Long)
hWnd・・・ドラッグ&ドロップを設定するウィンドウのハンドルを指定。
fAccept・・・hWndで指定されたウィンドウが、ドロップされたファイルを受け入れるかどうかを指定。
TRUEを指定するとファイルを受け入れ、FALSEを指定するとファイルを受け入れない。
【戻り値】
戻り値はない。
サンプルコード
DragQueryFile関数
ドラッグ&ドロップ操作が成功した場合、ドロップされたファイルの名前(パス)を取得する。msdn[詳細]
【宣言】
Declare PtrSafe Function DragQueryFile Lib "shell32.dll" Alias "DragQueryFileA" ( _ ByVal hDrop As Long, _ ByVal UINT As Long, _ ByVal lpStr As String, _ ByVal ch As Long) As Long
hDrop・・・ドロップされたファイルの名前を保持している、1個の内部構造体のハンドルを指定。
iFile・・・ファイルのインデックス番号を指定。それに応じてlpszFileにファイル名が格納される。
-1を指定すると、DragQueryFileは、ドロップされたファイルの総数を戻り値に返す。
0~ドロップファイル数未満の値を指定すると、lpszFileが指すバッファに対応のファイル名を格納する。
lpszFile・・・ファイル名を格納するバッファを設定する。
cch・・・lpszFile が指すバッファのサイズを文字単位で指定。
【戻り値】
iFileに-1を指定するとファイルの総数が返る。
関数がバッファにファイル名を格納すると、格納した文字数が返る。終端のNULL文字は、文字数に含まれない。
サンプルコード
DragFinish関数
アプリケーションへファイル名を転送するためにシステムが割り当てたメモリを解放する。msdn[詳細]
【宣言】
Declare PtrSafe Sub DragFinish Lib "shell32.dll" (ByVal hDrop As Long)
hDrop・・・ドロップされたファイルについて記述している内部構造体のハンドルを指定。
このハンドルは、WM_DROPFILESメッセージの wParam パラメータから取得できる。
サンプルコード