大图:我试图在资源管理器的拖放中注入我自己的包装器。我的代码被注入资源管理器,我尝试用我自己的替换放置目标。
为了做到这一点,我正在做:
- 查找所有资源管理器窗口(使用 EnumWindows 并检查每个窗口的进程关联)。
- 对于每个窗口,我都运行以下(什么都不做)代码:
IDropTarget* lpDT = (IDropTarget *)GetProp(hwnds[i], L"OleDropTargetInterface"); //获取现有的放置目标
HRESULT res1 = ::RevokeDragDrop(hwnds[i]); //撤销现有的放置目标
HRESULT res2 = ::RegisterDragDrop(hwnds[i], lpDT); //并重新注册放置目标
目前,代码不会更改放置目标。我只是取消注册并重新注册同一个目标。
在所有资源管理器窗口上运行它后,我得到 res1 == "该应用程序调用了一个为不同线程编组的接口。" 对于我找到的每个窗口。
如果我忽略错误(仅用于测试)并继续进行替换,则资源管理器将停止在桌面上拖动文件(仅更改图标位置)。顺便说一句,令人惊讶的是,在 2 个不同文件夹之间拖动文件仍然有效。
我的代码从资源管理器线程(注入资源管理器)运行。
有没有办法解决这个问题?