Обнаружение аудио звонка в Office Communicator
То, что я пытаюсь сделать, - это функциональность, которая советует пользователям, которые совершают аудиовызовы в офисном коммуникаторе по беспроводному соединению, вместо этого использовать проводное соединение.
Я искал вокруг, но не смог найти информацию, которую я ищу
Я ищу способ определить, находится ли Office Communicator в режиме аудиовызова. Есть простой способ сделать это?
1 ответ
Я не думаю, что вы сможете получить именно то, что вам нужно с помощью Communicator, но вы можете подобраться ближе. (возможно, вы могли бы стать еще ближе или даже ближе, если бы вам пришлось перейти на Lync).
Вам нужно будет использовать Automation 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";
}
Кстати, не забудьте принять это как ответ, используя "галочку", если вы чувствуете, что это помогло:)