恢复文件拖放

Posted

技术标签:

【中文标题】恢复文件拖放【英文标题】:Restore file drag and drop 【发布时间】:2020-06-18 19:53:03 【问题描述】:

我想阻止在应用程序上拖放文件。为此,我可以使用 win32 API

[DllImport("ole32.dll")]
public static extern int RevokeDragDrop(UIntPtr hwnd);

现在,我想恢复该应用程序的拖放操作。有什么 API 可以恢复吗?

【问题讨论】:

在 C# 程序中,您通常会更改 AllowDrop 属性以调用这些本机函数。我们不知道您为什么要 pinvoke,如果 hwnd 属于另一个进程,则无法正确重新启用它。由于 IDropTarget 接口引用必须属于该进程。 如果可以为外部程序启用它,那不算是安全隐患吗? 【参考方案1】:

您将使用 RegisterDragDrop 函数,这是(可能)最初设置的方式。

来自https://docs.microsoft.com/en-us/windows/win32/api/ole2/nf-ole2-registerdragdrop:

如果您的应用程序可以在 OLE 拖放操作期间接受拖放的对象,则必须调用 RegisterDragDrop 函数。每当您的应用程序窗口之一可用作潜在的放置目标时,即当窗口在屏幕上未遮挡时,请执行此操作。

【讨论】:

请注意,RegisterDragDrop() 不是窗口接受丢弃的唯一方式。还有DragAcceptFiles()。另请注意,RegisterDragDrop() 需要一个 IDropTarget 对象,您无法从窗口查询该对象,因此如果您 RevokeDragDrop() 一个您不拥有的窗口,您将无法正确恢复其 IDropTarget。跨度> 我不拥有这个窗口。 RegisterDragDrop 似乎只是一种方式,因为我们似乎无法使用 RegisterDragDrop 将其恢复。看起来 DragAcceptFiles 可能会有所帮助。我会调查的。 从问题中不清楚您不拥有该窗口。对不起! 我尝试使用 [DllImport("shell32.dll")] public static extern void DragAcceptFiles(IntPtr hwnd, bool fAccept);然后从代码中,我调用了 DragAcceptFiles(handleOfThatProcess,false) 但它没有阻止该应用程序中的拖放文件。 还有其他方法可以实现吗?阻止文件拖放并再次取消阻止。我知道使用鼠标钩子可以解决这个问题,但是鼠标钩子会占用太多 CPU。

以上是关于恢复文件拖放的主要内容,如果未能解决你的问题,请参考以下文章

如何检测pdf文档是不是有损坏

winhex怎么恢复文件数据恢复

关于文件恢复的问题

如何恢复删除掉的CVS文件

如何恢复已删除的文件?

CentOS系统误删除文件怎么恢复