0

大图:我试图在资源管理器的拖放中注入我自己的包装器。我的代码被注入资源管理器,我尝试用我自己的替换放置目标。

为了做到这一点,我正在做:

  1. 查找所有资源管理器窗口(使用 EnumWindows 并检查每个窗口的进程关联)。
  2. 对于每个窗口,我都运行以下(什么都不做)代码:

IDropTarget* lpDT = (IDropTarget *)GetProp(hwnds[i], L"OleDropTargetInterface"); //获取现有的放置目标

HRESULT res1 = ::RevokeDragDrop(hwnds[i]); //撤销现有的放置目标

HRESULT res2 = ::RegisterDragDrop(hwnds[i], lpDT); //并重新注册放置目标

目前,代码不会更改放置目标。我只是取消注册并重新注册同一个目标。

在所有资源管理器窗口上运行它后,我得到 res1 == "该应用程序调用了一个为不同线程编组的接口。" 对于我找到的每个窗口。

如果我忽略错误(仅用于测试)并继续进行替换,则资源管理器将停止在桌面上拖动文件(仅更改图标位置)。顺便说一句,令人惊讶的是,在 2 个不同文件夹之间拖动文件仍然有效。

我的代码从资源管理器线程(注入资源管理器)运行。

有没有办法解决这个问题?

4

1 回答 1

-1

GetProp 返回一个指向放置目标的指针,而不关心它的编组(纯指针)。正如在这个答案中向我指出的那样,虽然我得到了一个指向放置目标的指针,但它并没有真正编组到我的线程。我可以告诉你,在指针上调用 revokeDragDrop(即使它并不真正属于我的线程)会弄乱放置目标,然后失败。

由于我无法从持有它的其他线程获得放置目标,因此我放弃了这一点并采取了替代路线。

于 2012-05-23T17:33:58.317 回答