我尝试接受从文件资源管理器拖放到表单的文件,但它不起作用。永远不会调用我的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 :(得分:18)
您很可能正在运行升级的应用程序。可能是因为你正在运行Delphi提升。在Vista及更高版本中,低权限进程无法向更高权限进程发送消息。这个MSDN blog解释得更多。
如果您正在运行Delphi IDE,我建议您停止这样做。标准桌面应用程序开发很少需要这样做。
正如雷米指出的那样,你的DestroyWnd
不正确。在调用DragAcceptFiles
之前,您正在销毁窗口句柄。只需颠倒订单即可。我个人在WindowHandle
和CreateWnd
使用DestroyWnd
。如果未分配窗口句柄,则Handle
属性会创建窗口句柄,因此会屏蔽此类错误。
procedure TForm1.CreateWnd;
begin
inherited;
DragAcceptFiles(WindowHandle, True);
end;
procedure TForm1.DestroyWnd;
begin
DragAcceptFiles(WindowHandle, false);
inherited;
end;