Hola Lepuke.
Ejemplo para versiones anteriores a Windows 7:
Código Delphi
[-]
...
type
TForm1 = class(TForm)
ListBox1: TListBox;
procedure FormCreate(Sender: TObject);
private
procedure DragDropFile(var Msg: TMessage ); message WM_DROPFILES;
public
end;
...
implementation
uses ShellApi;
procedure TForm1.DragDropFile(var Msg: TMessage);
var
Cont, i : integer;
FName : array [0..MAX_COMPUTERNAME_LENGTH+MAX_PATH] of char;
begin
Cont := DragQueryFile(Msg.WParam, $FFFFFFFF, FName, 255)-1;
for i := 0 to Cont do
begin
DragQueryFile(Msg.WParam, i, FName, 255);
ListBox1.Items.Add(FName);
end;
DragFinish(msg.WParam);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
DragAcceptFiles(Handle, True );
ListBox1.Items.Clear;
end;
A partir de Windows 7,por motivos de seguridad, se filtran los mensajes enviados de una aplicación a otra (entre los que está Drag&Drop), por lo que previamente hay que elevar el privilegio mediante la función
ChangeWindowMessageFilter
Código Delphi
[-]
type
TForm1 = class(TForm)
ListBox1: TListBox;
procedure FormCreate(Sender: TObject);
private
procedure DragDropFiles(var Msg: TMessage ); message WM_DROPFILES;
public
end;
...
implementation
uses ShellApi;
const
MSGFLT_ADD = 1;
var
ChangeWindowMessageFilter: function (msg: Cardinal; dwFlag : Word):BOOL; stdcall;
procedure TForm1.DragDropFiles(var Msg: TMessage);
var
Cont,i : integer;
FName : array [0..MAX_COMPUTERNAME_LENGTH+MAX_PATH] of char;
begin
Cont:= DragQueryFile(Msg.WParam, $FFFFFFFF, FName, 255)-1;
for i:= 0 to Cont do
ChangeWindowMessageFilter (i, MSGFLT_ADD);
for i := 0 to Cont do
begin
DragQueryFile(Msg.WParam, i, FName, 255);
ListBox1.Items.Add(FName);
end;
DragFinish(msg.WParam);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
@ChangeWindowMessageFilter:= GetProcAddress(LoadLibrary('user32.dll'),'ChangeWindowMessageFilter');
if Assigned (ChangeWindowMessageFilter) then
begin
ChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD);
ChangeWindowMessageFilter(WM_COPYDATA, MSGFLT_ADD);
ChangeWindowMessageFilter($0049, MSGFLT_ADD);
end;
DragAcceptFiles(Handle, True);
ListBox1.Items.Clear;
end;
Saludos