2012-05-22 36 views
1

大picuture:我试图注入我自己的包装探险家的拖放n下降。我的代码被注入到资源管理器中,我尝试用我自己的替换掉目标。挂钩资源管理器拖放失败

为了做到这一点我做的:

  1. 找到所有IE窗口(使用EnumWindows的,并检查每个窗口过程协会)。
  2. 对于我运行下述(什么也不做)代码中的每个窗口:

*下降目标= lpDT(*下降目标)GetProp(hwnds [I]中,L “OleDropTargetInterface”); //获得现有放置目标

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

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

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

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

如果我忽略错误(仅用于测试),并继续进行替换,那么当前浏览器将停止拖动桌面上的文件(仅用于更改图标位置)。顺便说一句,令人惊讶的是,在两个不同文件夹之间拖动文件仍然有效。我的代码是从一个资源管理器线程(注入资源管理器)运行。

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

回答

0

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

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

相关问题