恢复文件拖放
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。以上是关于恢复文件拖放的主要内容,如果未能解决你的问题,请参考以下文章