抑制Outlook现场打印

时间:2009-03-31 15:13:10

标签: c# outlook

我们已经为Outlook编写了一个附加组件,用于将电子邮件存入我们的CRM系统。在此过程中,它将Outlook消息ID作为UserField保存在消息本身上。

例如

currentUserProperty = Constants.APPLICATION_NAME + "EntryID";
mailItem.UserProperties.Add(currentUserProperty,
       Microsoft.Office.Interop.Outlook.OlUserPropertyType.olText,
       Missing.Value,
       Missing.Value).Value = entryId;

不幸的是,这是一个HUUUGGEE号码,很像:

“00000000D502D779150E2F4580B1AADDF04ECDA6070097EF5A1237597748A4B4F9BFF540020800000006E9E4000068BB5B6DFC36924FAEC709A17D056583000002DE0E350000”

问题是,当用户打开消息时,Outlook坚持要包含此字段(在From / To下面)并且因为它没有空格,所以无法包装ID并压缩A4页面,直到它可以水平放置。这会产生极小的电子邮件打印输出。

有什么方法可以纠正这个吗?我曾想过用一个空格分隔的覆盖字段OriginalEntryID(导致问题的那个),但是我从COM层得到一个异常。我的下一步是尝试抑制Outlook静止的这个和其他用户定义字段的输出。

有谁知道如何实现这一目标?

2 个答案:

答案 0 :(得分:16)

您必须使用 .NET Reflection 来解决此问题(按照Microsoft支持的建议)。希望这将在未来版本的VSTO SDK中修复。

取消Outlook用户字段打印

static void SuppressUserPropertyPrinting(Outlook.MailItem message)
{
    try
    {   // Late Binding in .NET: https://support.microsoft.com/en-us/kb/302902
        Type userPropertyType;
        long dispidMember = 107;
        long ulPropPrintable = 0x4; // removes PDO_PRINT_SAVEAS
        string dispMemberName = String.Format("[DispID={0}]", dispidMember);
        object[] dispParams;

        if (message.UserProperties.Count == 0) return; // no props found (exit)

        // marks all user properties as suppressed
        foreach (Outlook.UserProperty userProperty in message.UserProperties.Cast<Outlook.UserProperty>())
        {
            if (userProperty == null) continue; // no prop found (go to next)
            userPropertyType = userProperty.GetType(); // user property type

            // Call IDispatch::Invoke to get the current flags
            object flags = userPropertyType.InvokeMember(dispMemberName, BindingFlags.GetProperty, null, userProperty, null);
            long lFlags = long.Parse(flags.ToString()); // default is 45 - PDO_IS_CUSTOM|PDO_PRINT_SAVEAS|PDO_PRINT_SAVEAS_DEF (ref: http://msdn.microsoft.com/en-us/library/ee415114.aspx)

            // Remove the hidden property Printable flag
            lFlags &= ~ulPropPrintable; // change to 41 - // PDO_IS_CUSTOM|PDO_PRINT_SAVEAS_DEF (ref: http://msdn.microsoft.com/en-us/library/ee415114.aspx)

            // Place the new flags property into an argument array
            dispParams = new object[] { lFlags };

            // Call IDispatch::Invoke to set the current flags
            userPropertyType.InvokeMember(dispMemberName, BindingFlags.SetProperty, null, userProperty, dispParams);
        }
    }
    catch { } // safely ignore if property suppression doesn't work
}

答案 1 :(得分:0)