挂钩浏览器拖放失败

时间:2012-05-22 07:56:10

标签: c++ drag-and-drop hook ole

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

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

  1. 找到所有资源管理器窗口(使用EnumWindows并检查每个窗口的进程关联)。
  2. 对于每个窗口,我运行以下(不执行任何操作)代码:
  3.   

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

         

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

         

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

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

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

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

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

    有没有解决这个问题的方法?

1 个答案:

答案 0 :(得分:-1)

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

由于我无法从持有它的另一个线程中获取掉落目标,所以我放弃了这个并采取了替代路线。