Я знаю это, но в Outlook 2007 есть ошибка или отсутствует функция. Когда вы удаляете получателя (адреса электронной почты) из поля, mailItem не обновляет коллекцию получателей. Он обновляется только при добавлении и разрешении получателя!
Таким образом, единственный способ, по которому я вижу, это прочитать содержимое поля To-Field is..via SendMessage.
private int EditStreamProc(MemoryStream dwCookie, IntPtr pbBuff, int cb, out int pcb)
{
pcb = cb;
byte[] buffer = new byte[cb];
Marshal.Copy(pbBuff, buffer, 0, cb);
dwCookie.Write(buffer, 0, cb);
return 0;
}
private delegate int EditStreamCallback(MemoryStream dwCookie, IntPtr pbBuff, int cb, out int pcb);
[StructLayout(LayoutKind.Sequential)]
private struct EDITSTREAM
{
public MemoryStream dwCookie;
public int dwError;
public EditStreamCallback pfnCallback;
}
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SendMessage(IntPtr hwnd, uint msg, uint wParam, ref EDITSTREAM lParam);
private const int WM_USER = 0x0400;
private const int SF_RTF =3;
private const int EM_STREAMOUT = WM_USER + 74;
public string ReadRTFContentInOL2007(IntPtr handle)
{
string result = String.Empty;
using (System.IO.MemoryStream stream = new MemoryStream())
{
EDITSTREAM editStream = new EDITSTREAM();
editStream.pfnCallback = new EditStreamCallback(EditStreamProc);
editStream.dwCookie = stream;
SendMessage(handle, EM_STREAMOUT, SF_RTF, ref editStream);
stream.Seek(0, SeekOrigin.Begin);
using (StreamReader reader = new StreamReader(stream))
{
result = reader.ReadToEnd();
}
}
return result;
}
Когда адреса электронной почты будут решены, то я получаю это:
{\ rtf1 \ ANSI \ ansicpg1252 \ deff0 \ deflang1031 {\ fonttbl {\ f0 \ fswiss \ fprq2 \ fcharset0 Tahoma;} } {* \ генератор Riched20 12.0.6606.1000;} \ viewkind4 \ uc1 \ пард \ f0 \ FS17 {\ пикт \ wmetafile0
Так прогноз заменяет обычный текст с объектом, и мне нужно, чтобы получить всю информацию о RTF Content! Я думаю, что где-то в этом контенте должен быть адрес электронной почты. To - Field Class: RichEdit20WPT
Вы пытались вызвать метод Save после внесения каких-либо изменений в коллекцию получателей? Помогает ли это? –
@Eugene Astafiev Да, я пробовал это и да, это помогает. Но это не чистый способ справиться с получателями, на мой взгляд. Это приводит к обходу. Таким образом, единственный способ увидеть изменения в текстовых полях (To; Cc, Bcc) -Rich - это добавить обработчик в поля, которые проверяют наличие обновлений в полях, но до этого мне нужно получить содержимое поля, и это моя проблема. –
Outlook кэширует и не отражает изменения, внесенные в пользовательский интерфейс через объектную модель. Вам нужно сохранить элемент, чтобы получить видимые изменения и события ItemChange. –