C# 是否可以区分通过拖放和通过附件菜单按钮添加的附件

C# 是否可以区分通过拖放和通过附件菜单按钮添加的附件,c#,outlook,outlook-addin,email-attachments,C#,Outlook,Outlook Addin,Email Attachments,我有一个处理电子邮件附件的outlook加载项。我有自己的功能区按钮来添加附件,但我希望捕获通过拖放添加的附件,同时忽略使用标准附件按钮添加的附件 实现ItemEvents_10_BeforeAttachmentAddEventHandler()非常简单,但我不知道如何区分通过拖放和通过附件菜单按钮添加的附件 这可能吗 是否可以自己直接处理拖放事件 OOM在这里帮不了你。 理论上,您可以覆盖Outlook拖放处理程序 使用IOleWindow界面获取检查器的窗口句柄(您可以将Inspector对

我有一个处理电子邮件附件的outlook加载项。我有自己的功能区按钮来添加附件,但我希望捕获通过拖放添加的附件,同时忽略使用标准附件按钮添加的附件

实现ItemEvents_10_BeforeAttachmentAddEventHandler()非常简单,但我不知道如何区分通过拖放和通过附件菜单按钮添加的附件

这可能吗

是否可以自己直接处理拖放事件

OOM在这里帮不了你。 理论上,您可以覆盖Outlook拖放处理程序

  • 使用
    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吗?