我需要检测拖放操作外用, 是否可以?我想到写一个钩子来检测这些操作。任何人都可以指出我可以尝试挂钩哪些消息或 api 函数来检测拖放事件的正确方向吗?我想用 C# 来做这个。
提前致谢。
您可以通过两条明显的路径来尝试此操作。
第一个是挂钩参与调解拖放操作的 OLE 函数。这假设其他应用程序正在使用真正的拖放而不是某些仅限内部的版本。确定这一点超出了我的能力 - 无需访问该程序 - 但如果可以从该外部应用程序拖动到其他应用程序窗口(包括桌面),则很好地表明该应用程序正在使用真实的东西。
您需要挂钩的功能是注册拖放 http://msdn.microsoft.com/en-us/library/ms678405(VS.85).aspx, 尽管拖放操作 http://msdn.microsoft.com/en-us/library/ms678486(VS.85).aspx可能也有兴趣。RegisterDragDrop
被调用来注册一个放置目标,并给你一个机会来包装IDropTarget
以您想要的方式(大概是 IPC'ing 到您的实际应用程序中),RevokeDragDrop,然后传递注册,但现在使用您的包装对象。IDropTarget::删除 http://msdn.microsoft.com/en-us/library/ms687242(VS.85).aspx您可能会在其中完成大部分 IPC。
第二种方法是将 Windows 挂钩注入到应用程序中。这只有在以下情况下才容易处理:了解触发拖动的用户操作,并可以检测它们因为您必须区分拖动操作和普通的键盘/鼠标操作。有问题的钩子是WH_CALLWNDPROC
钩子,注册于设置WindowsHookEx http://msdn.microsoft.com/en-us/library/ms644990(VS.85).aspx。基本上,你定义一个WndProc
它获取应用程序窗口执行的所有消息(包括鼠标移动),并由您决定拖动操作何时开始和何时停止。
无论哪种情况,大量代码都可以用 C# 编写。通过 p\invoke 你可以得到设置WindowsHookEx http://www.pinvoke.net/default.aspx/user32.SetWindowsHookEx,并且您也可以在 C# 中实现 COM 对象(以及扩展这些 COM 对象的包装器)。事实上,有一个删除目标 http://msdn.microsoft.com/en-us/library/system.windows.forms.idroptarget.aspx.NET 2.0 中已有类;这可能已经是 COM 可见的了。
不幸的是,挂钩 API 的级别非常低,您通常必须使用 C 或 C++ 才能完成任何工作。我听说过一些好消息Detours http://research.microsoft.com/en-us/projects/detours/,加上来自 Microsoft 的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)