Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用.Net检测外部应用程序中的拖放操作_C#_.net_Winapi_Drag And Drop - Fatal编程技术网

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

C# 使用.Net检测外部应用程序中的拖放操作,c#,.net,winapi,drag-and-drop,C#,.net,Winapi,Drag And Drop,我需要检测外部应用程序中的拖放操作,是否可能?我想写一个钩子来检测这些操作。有人能告诉我,我可以尝试钩住哪些消息或api函数来检测拖放事件,这是正确的方向吗?我想用C#做这件事 提前感谢。您所能做的最好的事情就是连接到外部应用程序。根据我的经验(我上一次这样做是在两年前),实现精确钩子的唯一方法是混合使用C/C++和C# 要完成所有这些,您需要熟悉平台调用和Windows SDK。有些人可能会说您只需要p/invoke部分,但在我的探索中,我发现访问SDK中的头文件和库文件是非常宝贵的。此外,我

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


提前感谢。

您所能做的最好的事情就是连接到外部应用程序。根据我的经验(我上一次这样做是在两年前),实现精确钩子的唯一方法是混合使用C/C++和C#

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

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


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

正如你提到的,你需要使用Windows API——因此我希望你在C语言中使用一些不安全代码或者考虑使用C++。 一种方法由女士描述。
我的猜测是,您需要查看HCBT_激活(窗口被激活)和HCBT_单击跳过(鼠标单击)-但这只是一个猜测。


另一个想法是看看——它有分析窗口的工具——也许你可以在一个好地方重用它——这样你就可以节省一些分析部分的工作。

有两个明显的途径可以尝试

第一种方法是挂接中介拖放操作所涉及的OLE函数。这假定其他应用程序使用的是真正的拖放,而不是某些仅限内部版本。确定这超出了我的能力-无法访问该程序-但如果可能从该外部应用程序拖动到其他一些应用程序窗口(包括桌面),则很好地表明该应用程序正在使用真实的内容

您需要钩住的函数是,尽管可能也很有趣
RegisterDragDrop
被调用以注册一个drop目标,并使您有机会将
IDropTarget
包装到所需的maner中(可能是IPC'ing到实际应用中),撤销DragDrop,然后继续注册,但现在改为使用包装器对象。大概就是你要做大部分IPC的地方

第二种方法是向应用程序中注入Windows钩子。只有当您了解触发拖动的用户操作,并且能够检测到它们时,这才是容易处理的,因为您必须区分拖动操作和正常的键盘/鼠标操作。所讨论的钩子是注册于的
WH_CALLWNDPROC
钩子。基本上,您可以定义一个
WndProc
,它获取应用程序窗口执行的所有消息(包括鼠标移动),并由您确定拖动操作何时开始和何时停止

在这两种情况下,很多代码都可以用C语言编写。使用p\invoke,您可以获得,并且您还可以在C#中实现COM对象(以及这些COM对象的包装器)。事实上,在.NET2.0中已经有一个类;可能已经可以看到了


不幸的是,挂钩API是非常低的级别,通常你需要在C或C++中工作才能完成任何任务。我从微软那里听说了一些关于its的好消息。

请再多说一点关于“外部”应用程序的情况:它是由谁启动的?(你?它可以是任何应用程序?):这是一个你有源代码的应用程序(在C#?)。请确切地说什么(或什么类型的东西)被拖动,以及它们被放到哪里(你的应用程序?)。谢谢,外部应用程序一直在运行,我没有源代码。我想检测应用程序何时开始和完成某些视觉元素(控件)的拖放,并检测它们被释放的位置。我尝试了这两种方法,但都没有成功,尽管我可能做得不正确。这确实有效吗?RegisterDragDrop的问题似乎是,您试图钩住的外部应用程序可能已经调用了该函数,而您似乎不能有两个注册。编辑:我试过SetWinEventHook,而不是setWindowshookx。我会测试的!