使用.Net检测外部应用程序中的拖放操作

我需要检测外部应用程序中的拖放操作,是否可能? 我想写一个钩子来检测这些操作。 任何人都可以指出我正确的方向,我可以尝试挂钩哪些消息或api函数来检测拖放事件? 我想在C#中这样做。

提前致谢。

您可以通过两条明显的路径尝试这一点。

第一个是挂钩介入拖放操作所涉及的OLE函数。 这假设其他应用程序使用真正的拖放而不是某些内部版本。 确定这一点超出了我的能力 – 无法访问程序 – 但如果可以从这个外部应用程序拖动到其他应用程序窗口(包括桌面),则表明应用程序正在使用真实的东西。

你需要挂钩的函数是RegisterDragDrop ,尽管DoDragDrop也可能是有意义的。 调用RegisterDragDrop来注册放置目标,并让您有机会将IDropTarget包装在您想要的主管(可能是IPC到您的实际应用程序中),RevokeDragDrop然后传递注册,但现在使用您的包装器对象。 IDropTarget :: Drop可能就是你要做大部分IPC的地方。

第二种方法是将Windows挂钩注入应用程序。 如果您了解触发拖动的用户操作,并且可以检测它们 ,那么这只是易于理解的,因为您将不得不区分拖动操作和正常的键盘/鼠标操作。 有问题的钩子是在SetWindowsHookEx中注册的WH_CALLWNDPROC钩子。 基本上,您定义了一个WndProc ,它可以获取应用程序窗口所执行的所有消息(包括鼠标移动)以及由您决定拖动操作何时开始以及何时停止。

在任何一种情况下,很多代码都可以用C#编写。 使用p \ invoke,您可以获得SetWindowsHookEx ,并且您也可以在C#中实现COM对象(以及扩展,这些COM对象的包装器)。 事实上,.NET 2.0中已有一个IDropTarget类; 这可能是COM可见的。

不幸的是,挂钩API是非常低级的,你通常必须使用C或C ++来完成任何事情。 我听说过Detours以及微软的优点。

你可以做的最好的事情就是挂钩外部应用程序。 根据我的经验(我两年前做过这样的事情的最后一次),我能够实现准确钩子的唯一方法就是使用C / C ++和C#的混合。

要完成所有这些,您需要熟悉平台调用和Windows SDK。 有些人可能会说你只需要p / invoke,但在我的探索中,我发现访问SDK中的头文件和库文件是非常宝贵的。 另外,我发现Spy ++是一个很棒的工具,可以帮助我们进行钩子开发。

有许多关于挂钩Windows应用程序以及如何与外部进程通信的资源。 我可以在这里列出任意数量的这些,但是我不确定在技术文章和示例项目中你的偏好是什么。 就个人而言,我发现codeproject.com有很多关于挂钩的项目,有一些非常好的解释。

祝你好运; 我希望这有帮助。

正如您自己提到的,您将需要使用Windows-API – 因此我希望您有一些在C#中使用不安全代码或考虑使用C ++的经验。
MS 在此描述了一种方式。
我的猜测是你需要看看HCBT_ACTIVATE(窗口被激活)和HCBT_CLICKSKIPPED(鼠标点击) – 但这只是猜测。
另一个想法可能是查看Auto It Window Info – 它具有分析窗口的function – 也许你可以在一个好的地方重复使用它 – 这样你就可以在分析部分保存一些工作。