win7上的WMDropFiles问题

Mar*_*cus 3 delphi drag-and-drop windows-vista windows-7 delphi-2010

我已经实现了以下过程,当我在运行Windows Vista,计算机#1的计算机上编译它时,它可以正常工作.如果我将创建的.exe文件共享到另一台运行win7的计算机,计算机#2,它运行良好.问题是,当我让计算机#2编译它时,它不会简单地认识到应用程序上丢弃了任何东西.这段代码完全没有响应.它的构建和编译没有错误或警告.我一直在网上搜索一段时间没有找到任何解释为什么会发生这种情况或其他人有这个问题.

两台计算机都使用安装了相同组件的Delphi 2010.

  1. 这是允许用户将文件拖放到应用程序的方法吗?如果没有,今天应该怎么做?
  2. 任何想法为什么它在计算机#1而不是计算机#2上编译时有效?(在计算机#1上编译时,程序在两台计算机上都能正常工作)

任何帮助或评论都非常感谢.

procedure TfMainForm.WMDROPFILES(var msg: TWMDropFiles);
const
  MaxLength = 255;

var
  nFiles : integer;
  i : integer;
  fileName : array [0..MaxLength] of char;
  fileNames : TStringArray;

begin
  // Get number of files dropped
  nFiles := DragQueryFile(msg.Drop,  $FFFFFFFF, fileName, MaxLength);

  // Get filenames
  SetLength(fileNames, nFiles);
  for i := 0 to nFiles - 1 do begin
    DragQueryFile(msg.Drop, i, fileName, MaxLength);
    fileNames[i] := fileName;
  end;

    // Add files
  projectHandler.addFiles(fileNames);

  //release memory
  DragFinish(msg.Drop);
end;
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 5

如果你是在计算机#2上的IDE中运行,我会猜测一下.我敢打赌,如果你在计算机#2上编译,但是从资源管理器而不是从IDE启动可执行文件,它就可以工作.拼图的最后一块是我打赌你是在管理员的计算机#2上运行你的IDE.

在Vista和Windows 7上,您无法将消息发送到具有更高完整性级别的进程.如果您的进程以管理员身份运行,那么它将具有比资源管理器更高的完整性级别,因此不会接受已删除的文件.

如果我的猜测是正确的,我建议您停止以管理员身份运行Delphi,它不需要这个.

至于是否WM_DROPFILES合理,我认为使用它没有问题.

  • 您可以使用[ChangeWindowMessageFilterEx](http://msdn.microsoft.com/en-us/library/dd388202(v = vs.85).aspx)允许从较低特权进程接收"WM_DROPFILES". (4认同)