Смотри функцию Windows API DragAcceptFiles. Вы должны это вызвать, чтобы зарегистрировать вашу программу в качестве "приемного пункта" перетаскиваемых файлов. Далее в вашем приложении вы должны реагировать на сообщение WM_DROPFILES, возникающее при операции drag/drop из File Manager. [000413]
DragAcceptFiles(Handle, True); |
После этого вы сможете получать сообщения WM_DROPFILES при перетаскивании файлов из File Manager в вашу форму. Для "отключения" этой характеристики необходимо вторично вызвать ту же API функцию, но со вторым параметром равным False.
Для получения имен перетаскиваемых файлов необходимо воспользоваться Windows функцией DragQueryFile, для получения информации при окончании операции Drag/Drop воспользуйтесь функцией DragFinish. DragQueryPt подскажет вам в каком месте формы былы "брошены" перетаскиваемые файлы.
Вам необходимо принимать файлы даже при свернутой форме? Для этого нужно дополнительно создать обработчик события OnMessage объекта Application. Нижеприведенный пример предполагает, что на форме имеется компонент ListBox, свойство Align которого установлено в alClient:
...{ Private declarations }procedure WMDropFiles(VAR Msg: TWMDropFiles);message WM_DROPFILES;procedure AppOnMessage(VAR Msg: TMsg;VAR Handled : Boolean);... implementation USES ShellApi; ... procedure TForm1.WMDropFiles(VAR Msg: TWMDropFiles); VAR N : Word;buffer : ARRAY[0..80] OF Char;BEGIN WITH Msg DOBEGINFOR N := 0 TO DragQueryFile(Drop, $FFFF, buffer, 80)-1 DOBEGINDragQueryFile(Drop, N, Buffer, 80);ListBox1.Items.Add(StrPas(Buffer));END;DragFinish(Drop);END; END; procedure TForm1.AppOnMessage(VAR Msg: TMsg; VAR Handled : Boolean);VAR WMD : TWMDropFiles; BEGIN IF Msg.message = WM_DROPFILES thenBEGINMessageBeep(0);WMD.Msg := Msg.message;WMD.Drop := Msg.wParam;WMD.Unused := Msg.lParam;WMD.Result := 0;WMDropFiles(WMD);Handled := TRUE;END; END; procedure TForm1.FormCreate(Sender: TObject); begin DragAcceptFiles(Handle, True);DragAcceptFiles(Application.Handle, True);Application.OnMessage := AppOnMessage;end; |
[000466]