-1

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

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

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

4

1 回答 1

1

TreeView 本身没有IDataObject

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

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

  1. 在 TreeView 本身上模拟鼠标输入,因此它认为用户正在正常拖动节点。

  2. TVN_BEGINDRAG手动模拟。这需要使用VirtualAllocEx()and在 TreeView 所属进程的内存地址空间内WriteProcessMemory()分配和填充合适的NMTREEVIEW结构,然后发送TVN_BEGINDRAG到 TreeView 的父窗口,将其指向该NMTREEVIEW结构。这意味着首先使用TVM_HITTESTTVM_GETITEM检索一些TVN_BEGINDRAG需要报告给应用程序的信息(最值得注意的是,树节点的HTREEITEM句柄和LPARAM值)。

这会诱使拥有的应用程序认为用户正在尝试拖动树节点并采取相应的行动。但是,它仍然在经历开始真正的 OLE 拖动操作的动作,因此用户必须将鼠标移动到您的应用程序窗口上并释放鼠标按钮(或者您必须模拟鼠标输入来进行编程)所以它IDataObject通常会放在你的窗口上。

于 2017-01-06T00:09:40.487 回答