파일 탐색기에서 드래그 앤 드롭 된 파일을 수락하려고했지만 작동하지 않습니다. 내 WM_DROPFILES 처리기가 호출되지 않습니다. Windows 8을 실행 중이므로 차이가 있습니다.델파이 형식으로 파일 드래그 앤 드롭
여기 (난 그냥 폼에 잇는 TMemo이) 내가하는 일의 간단한 예입니다 :
type
TForm1 = class(TForm)
Memo1: TMemo;
private
{ Private declarations }
procedure WMDROPFILES(var msg : TWMDropFiles) ; message WM_DROPFILES;
procedure CreateWnd; override;
procedure DestroyWnd; override;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.CreateWnd;
begin
inherited;
DragAcceptFiles(Handle, True);
end;
procedure TForm1.DestroyWnd;
begin
inherited;
DragAcceptFiles(Handle, false);
end;
procedure TForm1.WMDROPFILES(var msg: TWMDropFiles);
var
i, fileCount: integer;
fileName: array[0..MAX_PATH] of char;
begin
fileCount:=DragQueryFile(msg.Drop, $FFFFFFFF, fileName, MAX_PATH);
for i := 0 to fileCount - 1 do
begin
DragQueryFile(msg.Drop, i, fileName, MAX_PATH);
Memo1.Lines.Add(fileName);
end;
DragFinish(msg.Drop);
end;
코드를 테스트 한 결과 작동했습니다. Windows 7, Delphi XE. 나는'DestroyWnd'에서 줄만 바꾸었지만 그것은 중요하지 않아야합니다. 그것은 예상대로 작동합니다. – kludg
복제 : http://stackoverflow.com/questions/13482304/why-doesnt-my-form-receive-wm-dropfiles-when-files-are-dropped-on-it –
@Serg :'DestroyWnd의 순서)'이 중요합니다. 'dragAcceptFiles()'는'상속받은'전에 실제로 호출되어야합니다. 왜냐하면'상속받은'은 실제로'HWND'를 파괴 할 것이기 때문입니다. 다음에'Handle'이 파기 된 후에 읽을 때'CreateWnd()'를 통해 새로운'HWND'가 생성됩니다. 순서가 거꾸로되어있는 경우, 최종적으로 DragAcceptFiles (FALSE)가 마지막에 불려가 드래그 & 드롭이 무효가됩니다. –