发送窗口消息以将treeview项拖动到其他进程

时间:2017-01-05 23:47:30

标签: winapi drag-and-drop message-queue ui-automation data-objects

我可以枚举另一个进程中窗口中的树视图项。我希望能够以编程方式在树视图中的节点上启动拖放操作,将项目拖动到我控制的窗口中。最后,我只想访问每个树视图项的DataObject

是否可以使用PostMessage或其他方法来启动和完成拖放序列?可以在不取得鼠标所有权的情况下完成(即不会中断用户的鼠标位置)吗?

是否可以完成相同的任务,即使树视图项目位于折叠的树视图文件夹中(没有展开文件夹)?

1 个答案:

答案 0 :(得分:1)

TreeView本身没有IDataObject

TreeView拥有的应用程序负责检测用户何时尝试拖动TreeView节点(TreeView通过TNV_BEGINDRAG通知应用程序),然后应用程序可以创建一个合适的IDataObject并将其传递给DoDragDrop()函数以启动OLE拖动操作,该操作可以跨进程边界传递数据。

没有窗口消息可以发送到TreeView(或应用程序)以检索树节点的IDataObject,或直接启动拖动操作。关于你唯一可以做的就是:

  1. simulate mouse input覆盖TreeView本身,因此它认为用户正在正常拖动节点。

  2. 手动模拟TVN_BEGINDRAG。这需要使用VirtualAllocEx()WriteProcessMemory()在TreeView拥有进程的内存地址空间内分配和填充合适的NMTREEVIEW结构,然后发送TVN_BEGINDRAG到TreeView的父窗口,将其指向NMTREEVIEW结构。这意味着首先使用TVM_HITTESTTVM_GETITEM之类的内容来检索TVN_BEGINDRAG需要向应用报告的一些信息(最值得注意的是,树节点&{39}}处理和HTREEITEM值)。

  3. 这会欺骗拥有的应用程序认为用户正在尝试拖动树节点并相应地采取行动。但是,它仍然经历了启动真正的OLE拖动操作的动作,因此用户必须在您的应用程序窗口上移动鼠标并释放鼠标按钮(或者您必须模拟鼠标输入才能进行编程)所以LPARAM通常会掉到你的窗户上。