delphi - 将文件拖放到 Delphi 表单中不起作用

标签 delphi delphi-2010

我尝试接受从文件资源管理器拖放到表单中的文件,但它不起作用。我的 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 之前销毁窗口句柄。只需颠倒顺序即可。就我个人而言,我会在 CreateWndDestroyWnd 中使用 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/

相关文章:

delphi - PixelsPerInch 的值随 Windows 主题而变化?

delphi - 将框架的内部控件公开为属性,但未注册更改。我忘记注册什么了?

delphi - 递归析构函数

multithreading - 在线程中获取 "waste time"最高效的 CPU 方式是什么?

delphi - 当控件的类名非常非常长时,为什么会出现访问冲突?

delphi - 并发更新死锁,但我看不到并发

sql - Delphi与SQL Server之间的冲突

delphi - 在 RAD Studio 2010 上有创建区域的快捷方式吗?

delphi - 如何安装Delphi 10.2 Tokyo命令行编译器

delphi - 如何在 TIdHTTP 中指定自定义 HTTP 方法?