7

我正在使用 Embarcadero RAD Studio XE 开发应用程序。我正在尝试使用以下代码将文件拖放到应用程序中

TMainForm = class(TForm)
public:
  procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  DragAcceptFiles(Self.Handle, True);
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
  DragAcceptFiles(Self.Handle, False);
end;

procedure TMainForm.WMDropFiles(var Msg: TWMDropFiles);
begin
  inherited;
  showmessage('catch here');
  // some code to handle the drop files here
  Msg.Result := 0;
end;

这段代码没有问题。另外,当我拖放文件时,光标显示状态更改为拖放,但在拖放后,什么也没有发生(也没有显示消息)。这有什么问题吗?

4

2 回答 2

10

TForm.Create使用两条线

ChangeWindowMessageFilter (WM_DROPFILES, MSGFLT_ADD);

ChangeWindowMessageFilter (WM_COPYGLOBALDATA, MSGFLT_ADD);

就这样

于 2016-07-20T08:14:26.727 回答
9

在一个普通的 vanilla 应用程序中,问题中的代码导致在WMDropFiles将对象放在表单上时执行。因此,显然还有其他事情发生以阻止它工作。最明显的潜在原因是:

  1. 主窗体的窗口句柄在初始调用后重新创建DragAcceptFiles
  2. 您的进程运行的完整性级别高于在其上删除文件的进程。例如,您是否以管理员身份运行进程。请注意,以管理员身份运行 Delphi IDE 会导致您的进程在从 IDE 启动时以管理员身份运行。
  3. 您的过程中的其他东西正在干扰拖放。在不知道您的应用程序中有什么的情况下,很难猜测这可能是什么。开始删除应用程序的某些部分,直到只剩下问题中的代码。

选项 2 似乎很合理。要了解更多信息,请参阅:问:为什么当我的应用程序运行提升时拖放不起作用?– A:强制性完整性控制和 UIPI

于 2012-11-20T21:45:01.713 回答