2013-01-09 2 views
6

파일 탐색기에서 드래그 앤 드롭 된 파일을 수락하려고했지만 작동하지 않습니다. 내 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; 
+0

코드를 테스트 한 결과 작동했습니다. Windows 7, Delphi XE. 나는'DestroyWnd'에서 줄만 바꾸었지만 그것은 중요하지 않아야합니다. 그것은 예상대로 작동합니다. – kludg

+2

복제 : http://stackoverflow.com/questions/13482304/why-doesnt-my-form-receive-wm-dropfiles-when-files-are-dropped-on-it –

+4

@Serg :'DestroyWnd의 순서)'이 중요합니다. 'dragAcceptFiles()'는'상속받은'전에 실제로 호출되어야합니다. 왜냐하면'상속받은'은 실제로'HWND'를 파괴 할 것이기 때문입니다. 다음에'Handle'이 파기 된 후에 읽을 때'CreateWnd()'를 통해 새로운'HWND'가 생성됩니다. 순서가 거꾸로되어있는 경우, 최종적으로 DragAcceptFiles (FALSE)가 마지막에 불려가 드래그 & 드롭이 무효가됩니다. –

답변

17

당신이 당신의 응용 프로그램이 높은 실행 가능성이 높습니다. 아마도 델파이가 상승했기 때문일 것입니다. Vista 이상에서는 권한이 낮은 프로세스가 메시지를 상위 권한 프로세스에 보낼 수 없습니다. 이 MSDN blog에 대해 자세히 설명합니다.

Delphi IDE를 실행중인 경우, 그렇게하지 않는 것이 좋습니다. 표준 데스크톱 응용 프로그램 개발을 위해서는 그렇게 할 필요가 거의 없습니다. 레미가 지적 하듯이


, 당신의 DestroyWnd이 올바르지 않습니다. DragAcceptFiles을 호출하기 전에 창 핸들을 파괴하고 있습니다. 순서를 바꾸면됩니다. 개인적으로는 을 CreateWndDestroyWnd에 모두 사용하고 싶습니다. Handle 속성은 할당되지 않았 으면 창 핸들을 만들어서 그러한 오류를 숨 깁니다.

procedure TForm1.CreateWnd; 
begin 
    inherited; 
    DragAcceptFiles(WindowHandle, True); 
end; 

procedure TForm1.DestroyWnd; 
begin 
    DragAcceptFiles(WindowHandle, false); 
    inherited; 
end; 
+0

아마도 그랬 겠지요. 고마워 친구 :) –