我尝试接受从文件资源管理器拖放到表单中的文件,但它不起作用。我的 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;
最佳答案
您很可能正在提升应用程序的运行速度。可能是因为您运行的是 Delphi 提升版。在 Vista 及更高版本中,低权限进程无法向更高权限进程发送消息。这个MSDN blog解释更多。
如果您正在运行提升的 Delphi IDE,我强烈建议您停止这样做。标准桌面应用程序开发很少需要这样做。
<小时/>正如雷米指出的,您的 DestroyWnd
不正确。您将在调用 DragAcceptFiles
之前销毁窗口句柄。只需颠倒顺序即可。就我个人而言,我会在 CreateWnd
和 DestroyWnd
中使用 WindowHandle
。如果未分配的话,Handle
属性会创建窗口句柄,从而屏蔽此类错误。
procedure TForm1.CreateWnd;
begin
inherited;
DragAcceptFiles(WindowHandle, True);
end;
procedure TForm1.DestroyWnd;
begin
DragAcceptFiles(WindowHandle, false);
inherited;
end;
关于delphi - 将文件拖放到 Delphi 表单中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14244325/