Обнаружение аудио звонка в 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";
}

Кстати, не забудьте принять это как ответ, используя "галочку", если вы чувствуете, что это помогло:)

Другие вопросы по тегам