ファイルエクスプローラからドラッグしてフォームにドロップしたファイルを受け取りようとしましたが、動作しません。私のWM_DROPFILESハンドラは決して呼び出されません。私はそれが何か違いがあれば、Windows 8を実行しています。あなたは、アプリケーションが昇格実行されているほとんどのファイルをDelphiフォームにドラッグアンドドロップすると動作しない
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
重複:@stackoverflow.com/questions/13482304/why-doesnt-my-form-receive-wm-dropfiles-when-files-are-dropped-on-it –
@Serg: 'DestroyWndの順序) 'は重要です。 'inherited'は実際に' HWND'を破壊するので、 'DragAcceptFiles()'は 'inherited'の前に呼び出される必要があります。次に 'Handle'が破壊されて読み込まれると、' CreateWnd() 'を介して新しい' HWND'が作成されます。順序が後方にある場合、最終結果は 'DragAcceptFiles(FALSE)'が最後に呼び出され、ドラッグ&ドロップを無効にすることになります。 –