uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ShellAPI;
type
TForm1 = class(TForm)
ListBox1: TListBox;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;
public
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
{ Enable to accept drop files }
DragAcceptFiles(Handle,True);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
{ Disable to accept drop files }
DragAcceptFiles(Handle,False);
end;
procedure TForm1.WMDropFiles(var Msg: TWMDropFiles);
var
Index: Integer;
Count: Integer;
Size: Integer;
Filename: String;
begin
try
{ Get dropped filename }
Count := DragQueryFile(Msg.Drop,DWORD(-1),nil,0);
for Index := 0 to Count - 1 do
begin
{ Get filename length }
Size := DragQueryFile(Msg.Drop,Index,nil,0) + 1;
{ Get filename }
SetLength(Filename,Size);
Size := DragQueryFile(Msg.Drop,Index,PChar(Filename),Size);
SetLength(Filename,Size);
ListBox1.Items.Add(Filename)
end;
finally
{ Finish }
DragFinish(Msg.Drop);
end;
end;
2010/08/04追記: Windows Vista/7ではUIPI(User Interface Privilege Isolation、ユーザインタフェース特権分離)により、下位IL(Integrity Level)のプロセスから上位ILのプロセスに対して通信(メッセージを含む)を行うことができなくなっています。WindowsのExplorer(explorer.exe)は中IL(medium integrity level)で起動されていますから、高IL(high integrity level)で実行しているプログラムに対してファイルをドラッグアンドドロップすることはできない、ということになります。特にIDEを管理者権限で実行している場合、デバッグプロセスも管理者権限(=高IL)で実行されるため注意が必要です。詳しくはWindows Integrity Mechanism Designを参照してください。元ねたは公式フォーラムのエクスプローラからのドラッグ&ドロップスレッドの高橋さんの回答と、そこにリンクされているMicrosoftのVisual Studioフォーラムの管理者として起動したVS2005でデバッグするとWM_DROPFILESが発生しないスレッド。