为什么我的表单在文件被删除时不会收到WM_DropFiles?

时间:2012-11-20 21:17:23

标签: delphi drag-and-drop

我正在使用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;

这段代码没有问题。此外,当我拖放文件时,光标显示状态已更改为拖放,但在删除后,没有任何反应(也未显示任何消息)。这有什么不对吗?

2 个答案:

答案 0 :(得分:8)

在一个普通的vanilla应用程序中,当一个对象被删除在表单上时,问题中的代码会导致WMDropFiles执行。所以,显然还有其他事情可以阻止它发挥作用。最明显的潜在原因是:

  1. 首次调用DragAcceptFiles后,将重新创建主窗体的窗口句柄。
  2. 您的进程运行的完整性级别高于正在删除文件的进程。例如,您是否以管理员身份运行流程?请注意,以管理员身份运行Delphi IDE会导致您的进程在从IDE启动时以管理员身份运行。
  3. 您的过程中的其他内容正在干扰拖放。不知道你的应用程序中有什么,很难猜出这可能是什么。开始删除部分应用,直到除了问题中的代码之外什么都没有留下。
  4. 选项2似乎很合理。要了解详情,请参阅:Q: Why Doesn’t Drag-and-Drop work when my Application is Running Elevated? – A: Mandatory Integrity Control and UIPI

答案 1 :(得分:4)

TForm.Create中的

使用两行

ChangeWindowMessageFilter (WM_DROPFILES, MSGFLT_ADD);

ChangeWindowMessageFilter (WM_COPYGLOBALDATA, MSGFLT_ADD);

全部