【问题标题】:Is it possible to distinguish between attachments added with drag and drop and via the attachment menu button是否可以区分通过拖放添加的附件和通过附件菜单按钮添加的附件
【发布时间】:2019-01-30 23:18:39
【问题描述】:

我有一个处理电子邮件附件的 Outlook 插件。我有自己的功能区按钮来添加附件,但我想捕捉通过拖放添加的附件,同时忽略使用标准附件按钮添加的附件。

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

这可能吗?

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

【问题讨论】:

    标签: c# outlook outlook-addin email-attachments


    【解决方案1】:

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

    1. 使用IOleWindow 接口获取Inspector 的窗口句柄(您可以将Inspector 对象转换为IOleWindow)。
    2. 使用GetProp(hwnd, "OleDropTargetInterface") Windows API 获取现有的拖放处理程序 - 将返回值转换为IDropTarget 接口。您可能需要试验检查器的哪个子窗口是您想要的拖放目标。
    3. 调用RevokeDragDrop / RegisterDragDrop 传递您自己的IDropTarget 实现。然后,该实现可以(在完成您需要做的事情之后)调用原始的 IDropTarget 接口,让 Outlook 继续执行默认行为。

    【讨论】:

    • 我想我找到了正确的窗口,或者至少找到了一个处理拖放的窗口,但我现在的问题是非常基本的,GetProp() 返回一个 IntPtr 但我还没有弄清楚如何转换它到 IDropTarget。
    • 使用 Marshal.GetObjectForIUnknown()
    • 我似乎仍然无法获取或设置 IDropTarget。在以下代码中,将对象强制转换为 IDropTarget 会导致出现“不支持此类接口”的异常。这是一些显示我在做什么的代码: IntPtr targetPtr = GetProp(ptr, "OleDropTargetInterface"); if (targetPtr != IntPtr.Zero) { IDropTarget t = (IDropTarget) Marshal.GetObjectForIUnknown(targetPtr); }
    • 嗯...我不知道 - 我只在 Delphi 中做过这个(这对 COM 更友好)。
    • 你试过用 Marshal.GetTypedObjectForIUnknown 吗?
    【解决方案2】:

    我可能已经找到一种方法来区分通过拖放添加的附件和通过附件菜单按钮添加的附件,而无需覆盖拖放处理程序。

    当通过拖放添加附件时,Outlook 应用程序不在前台,因此它没有活动窗口。

    在我的 BeforeAttachmentAdd() 事件处理程序中,我执行以下测试:

    IntPtr hWnd = GetActiveWindow();                
    if (hWnd == IntPtr.Zero) {
    // Handle drag and drop attachment
    }
    

    【讨论】:

    • 这是不可靠的,因为在添加拖放附件时,有时应用程序可以在前台。但这是一个快速的解决方案,90% 的时间都可以使用。 (阅读:这是一个 hack。)
    猜你喜欢
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多