C# 是否可以区分通过拖放和通过附件菜单按钮添加的附件
我有一个处理电子邮件附件的outlook加载项。我有自己的功能区按钮来添加附件,但我希望捕获通过拖放添加的附件,同时忽略使用标准附件按钮添加的附件 实现ItemEvents_10_BeforeAttachmentAddEventHandler()非常简单,但我不知道如何区分通过拖放和通过附件菜单按钮添加的附件 这可能吗 是否可以自己直接处理拖放事件 OOM在这里帮不了你。 理论上,您可以覆盖Outlook拖放处理程序C# 是否可以区分通过拖放和通过附件菜单按钮添加的附件,c#,outlook,outlook-addin,email-attachments,C#,Outlook,Outlook Addin,Email Attachments,我有一个处理电子邮件附件的outlook加载项。我有自己的功能区按钮来添加附件,但我希望捕获通过拖放添加的附件,同时忽略使用标准附件按钮添加的附件 实现ItemEvents_10_BeforeAttachmentAddEventHandler()非常简单,但我不知道如何区分通过拖放和通过附件菜单按钮添加的附件 这可能吗 是否可以自己直接处理拖放事件 OOM在这里帮不了你。 理论上,您可以覆盖Outlook拖放处理程序 使用IOleWindow界面获取检查器的窗口句柄(您可以将Inspector对
IOleWindow
界面获取检查器的窗口句柄(您可以将Inspector
对象强制转换为IOleWindow
)GetProp(hwnd,“OleDropTargetInterface”)
Windows API获取现有的拖放处理程序-将返回值强制转换到IDropTarget
界面。您可能需要试验检查器的哪个子窗口是您想要的拖放目标RevokeDragDrop
/RegisterDragDrop
传递您自己的IDropTarget
实现。然后,该实现可以(在完成所需操作后)调用原始的IDropTarget
接口,让Outlook继续执行默认行为我可能已经找到了一种方法来区分通过拖放和通过附件菜单按钮添加的附件,而不必覆盖拖放处理程序 通过拖放添加附件时,Outlook应用程序不在前台,因此没有活动窗口 在BeforeAttachmentAdd()事件处理程序中,我执行以下测试:
IntPtr hWnd = GetActiveWindow();
if (hWnd == IntPtr.Zero) {
// Handle drag and drop attachment
}
这是不可靠的,因为在某些情况下,当添加拖放附件时,应用程序可能位于前台。但这是一个快速的解决方案,90%的时间都能奏效。(阅读:这是一个黑客攻击。)我想我已经找到了正确的窗口,或者至少找到了一个处理拖放操作的窗口,但我现在的问题非常基本,GetProp()返回一个IntPtr,但我还没有弄清楚如何将其转换为IDROPTTarget。使用Marshal.GetObjectForIUnknown()我似乎在获取或设置IDROPTTarget时仍然有问题。在下面的代码中,将对象强制转换为IDropTarget会导致一个异常,即“不支持这样的接口”。这里有一些代码显示了我正在做的事情:IntPtr targetPtr=GetProp(ptr,“OleDropTargetInterface”);如果(targetPtr!=IntPtr.Zero){IDropTarget t=(IDropTarget)Marshal.GetObjectForIUnknown(targetPtr);}Hmm。。。我不知道-我只是在Delphi中做的(它对COM友好得多)。你试过使用Marshal.GetTypedObjectForIUnknown吗?