通过InterOp Winforms控制拖放注册

时间:2011-12-12 11:37:30

标签: c# winforms vsto

很长一段时间我很害怕,但请耐心等待......

我有一个VSTO项目,它允许将Outlook项目(邮件,附件等)拖放到winforms控件上 - 特别是TreeView(托管在Outlook内的CustomTaskPane中),它通过突出显示拖动的文件夹来提供常用的UI反馈正在发生。 我已经将TreeView的AllowDrop属性设置为true,并且我想要的所有事件都在触发,一切都运行良好。

但是,我在旧版本的Outlook(2010年之前)中遇到过这种情况,其中VSTO公开的对象模型较旧,而且我无法访问允许我通过Outlook捕获正在拖动的内容的属性。托管代码。

我通过直接挂接到本机Windows拖放来解决这个问题。允许这样做的代码相当广泛,涉及很多互操作,但问题的关键是我必须通过注册控件 -

[DllImport("OLE32.DLL", ExactSpelling = true, CharSet = CharSet.Auto, PreserveSig = false)]
    public static extern void RegisterDragDrop(HandleRef hwnd, IOleDropTarget target);

我扩展TreeView类并实现IOleDropTarget以允许通过此方法注册我的新控件类。再次,这很好用,在一些c#魔法之后,在treview中任何地方掉落的任何内容都会将我删除的对象作为我可以使用的字节数组。

这是问题 通过互操作注册TreeView意味着我无法使用它的AllowDrop属性注册它。尝试两者都会抛出一个错误,告诉我我只能注册一次拖放控件。仅通过互操作注册它会完全绕过'托管'注册,就TreeView而言,它没有注册,这意味着我没有得到任何拖放事件,我无法处理任何反馈给用户

有没有什么方法可以使用互操作注册方法,同时告诉同一个控件它是通过常规的winforms方法注册拖放? 或者,任何人都可以想到任何巧妙的覆盖控件的方式,以便我从TreeView获得反馈,并从interop寄存器控件中获取丢弃的事件吗?

希望这一切都有意义。

提前感谢任何答案。

0 个答案:

没有答案