7

我尝试接受从文件资源管理器拖放到表单的文件,但它不起作用。我的 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;
4

1 回答 1

19

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

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


正如雷米指出的那样,你DestroyWnd是不正确的。您在调用之前破坏了窗口句柄DragAcceptFiles。只需颠倒顺序。就我个人而言,我会WindowHandle同时使用CreateWndDestroyWndHandle如果未分配该属性,则会创建窗口句柄,因此会屏蔽此类错误。

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

procedure TForm1.DestroyWnd;
begin
  DragAcceptFiles(WindowHandle, false);
  inherited;
end;
于 2013-01-09T19:32:03.860 回答