我试图接受从文件资源管理器拖放到窗体的文件,但它不起作用.永远不会调用我的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,MAX_PATH); Memo1.Lines.Add(fileName); end; DragFinish(msg.Drop); end;
解决方法
您很可能正在运行升级的应用程序.可能是因为你正在运行Delphi提升.在Vista及更高版本中,低权限进程无法向更高权限进程发送消息.这
MSDN blog解释了更多.
如果您正在运行Delphi IDE,我建议您停止这样做.标准桌面应用程序开发很少需要这样做.
正如雷米指出的那样,你的DestroyWnd是不正确的.在调用DragAcceptFiles之前,您正在销毁窗口句柄.只需颠倒订单即可.我个人在CreateWnd和DestroyWnd都使用WindowHandle.如果未分配窗口句柄,则Handle属性会创建窗口句柄,因此会屏蔽此类错误.
procedure TForm1.CreateWnd; begin inherited; DragAcceptFiles(WindowHandle,True); end; procedure TForm1.DestroyWnd; begin DragAcceptFiles(WindowHandle,false); inherited; end;