【问题标题】:Drag and Drop files to Delphi form not working将文件拖放到 Delphi 表单不起作用
【发布时间】:2013-01-09 18:49:00
【问题描述】:

我尝试接受从文件资源管理器拖放到表单的文件,但它不起作用。我的 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,德尔福 XE。我只在DestroyWnd 中换了行,但这没关系 - 它按预期工作。
  • @Serg:DestroyWnd() 中的顺序很重要。 DragAcceptFiles() 需要在inherited 之前调用,因为inherited 实际上会破坏HWNDHandle 被销毁后下次读取时,会通过CreateWnd() 创建一个新的HWND。如果顺序是倒序的,最终结果将是最后调用DragAcceptFiles(FALSE),禁用拖放。

标签: delphi delphi-2010


【解决方案1】:

您很可能正在运行提升的应用程序。可能是因为您正在运行 Delphi 提升。在 Vista 及更高版本中,低特权进程无法将消息发送到更高特权进程。这个MSDN blog 解释更多。

如果您正在运行您的 Delphi IDE 升级,我敦促您停止这样做。标准桌面应用程序开发很少需要这样做。


正如 Remy 指出的那样,您的 DestroyWnd 不正确。在调用DragAcceptFiles 之前,您正在销毁窗口句柄。只需颠倒顺序。我个人会在CreateWndDestroyWnd 中使用WindowHandleHandle 属性会在未分配时创建窗口句柄,从而屏蔽此类错误。

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

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

【讨论】:

  • 大概就是这样。谢谢哥们:)
猜你喜欢
  • 1970-01-01
  • 2013-12-22
  • 1970-01-01
  • 2015-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-30
相关资源
最近更新 更多