Не думаю, что вы сможете получить именно то, что вам нужно, с помощью Communicator, но вы можете подойти ближе.(возможно, вы могли бы стать еще ближе или даже ближе, если бы вам пришлось перейти на Lync).
Вам нужно будет использовать API автоматизации - документация здесь , загрузка здесь .
Первое, что нужно попробовать, это отловить изменения статуса пользователя:
MessengerClass _communicator;
public Form1()
{
InitializeComponent();
_communicator = new MessengerClass();
_communicator.OnMyStatusChange += new DMessengerEvents_OnMyStatusChangeEventHandler(_communicator_OnMyStatusChange);
}
void _communicator_OnMyStatusChange(int hr, MISTATUS mMyStatus)
{
AddText(string.Format("My Status changed to '{0}'", mMyStatus));
}
Вам нужен статус MISTATUS_ON_THE_PHONE
Недостатком этого является то, что некоторые статусы будут переопределять статус MISTATUS_ON_THE_PHONE.например, если пользователь установлен на «Онлайн», а затем совершает или принимает вызов, статус изменится на MISTATUS_ON_THE_PHONE.Но если их статус установлен на «Не беспокоить», и они делают или принимают вызов, статус НЕ изменится на MISTATUS_ON_THE_PHONE.
Возможно, вы можете немного обойти эту проблему, изучив вызов по мере его создания,Поймать создаваемое окно нового разговора довольно просто:
_communicator = new MessengerClass();
_communicator.OnIMWindowCreated += new DMessengerEvents_OnIMWindowCreatedEventHandler(_communicator_OnIMWindowCreated);
Проблема в том, что это сработает для IM и AV-разговоров, а также для входящих и исходящих разговоров.Невозможно напрямую определить, является ли вызов исходящим звуковым вызовом.
Вы также можете перехватить событие «Добавлен контакт», это даст вам некоторую информацию о том, какие получатели добавляются в разговор, и когда,Вполне возможно, что порядок, в котором это происходит, даст вам некоторую информацию относительно того, является ли он исходящим или входящим, и вы могли бы искать добавление «tel:» uri, чтобы сказать вам, является ли звонок на телефон (хотя это не будетпомощь от коммуникатора к вызовам коммуникатора)
_communicator.OnIMWindowContactAdded += new DMessengerEvents_OnIMWindowContactAddedEventHandler(_communicator_OnIMWindowContactAdded);
Лучше всего поиграть с событиями и посмотреть, что происходит при каких обстоятельствах.Этот код должен заставить вас работать с этим.
MessengerClass _communicator;
public Form1()
{
InitializeComponent();
_communicator = new MessengerClass();
_communicator.OnIMWindowCreated += new DMessengerEvents_OnIMWindowCreatedEventHandler(_communicator_OnIMWindowCreated);
_communicator.OnIMWindowDestroyed += new DMessengerEvents_OnIMWindowDestroyedEventHandler(_communicator_OnIMWindowDestroyed);
_communicator.OnIMWindowContactAdded += new DMessengerEvents_OnIMWindowContactAddedEventHandler(_communicator_OnIMWindowContactAdded);
_communicator.OnIMWindowContactRemoved += new DMessengerEvents_OnIMWindowContactRemovedEventHandler(_communicator_OnIMWindowContactRemoved);
_communicator.OnMyStatusChange += new DMessengerEvents_OnMyStatusChangeEventHandler(_communicator_OnMyStatusChange);
}
void _communicator_OnMyStatusChange(int hr, MISTATUS mMyStatus)
{
AddText(string.Format("My Status changed to '{0}'", mMyStatus));
}
void _communicator_OnIMWindowContactRemoved(object pContact, object pIMWindow)
{
AddText(string.Format("{0} - Participant removed - '{1}'", ((IMessengerConversationWndAdvanced)pIMWindow).HWND, ((IMessengerContactAdvanced)pContact).SigninName));
}
void _communicator_OnIMWindowContactAdded(object pContact, object pIMWindow)
{
AddText(string.Format("{0} - Participant added - '{1}'", ((IMessengerConversationWndAdvanced)pIMWindow).HWND, ((IMessengerContactAdvanced)pContact).SigninName));
}
void _communicator_OnIMWindowDestroyed(object pIMWindow)
{
AddText(string.Format("{0} Conversation Closed, duration = {1}", ((IMessengerConversationWndAdvanced)pIMWindow).HWND, (DateTime.Now - _start).ToString()));
}
void _communicator_OnIMWindowCreated(object pIMWindow)
{
try
{
AddText(string.Format("{0} Conversation Created", ((IMessengerConversationWndAdvanced)pIMWindow).HWND));
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private delegate void AddTextDelegate(string text);
private void AddText(string text)
{
if (textBox1.InvokeRequired)
{
textBox1.Invoke(new AddTextDelegate(AddText), text);
return;
}
textBox1.Text += text + "\r\n";
}
Кстати, не забудьте принять это как ответ, используя "галочку", если вы чувствуете, что это помогло:)