2013-03-06 3 views
3

Я устанавливаю обработчик события InstantMessageReceived, но он только срабатывает исходящие текстовые сообщения, а не входящие. Вот код, я бегу:Где в API Microsoft Lync я могу установить обработчик событий для входящих мгновенных сообщений?

# Register the app with Growl 
$icon = "https://docs.google.com/uc?export=download&id=0B1Weg9ZlwneOZmY2b1NSVXJ0Q2s" 
$types = '"new-im","new-call","invitation","share"' 
& 'C:\Program Files (x86)\Growl for Windows\growlnotify.exe' /a:Lync /ai:$icon /r:$types "Registration." 

#We just need the Model API for this example 
import-module "C:\Program Files (x86)\Microsoft Lync\SDK\Assemblies\Desktop\Microsoft.Lync.Model.Dll" 

#Get a reference to the Client object 
$client = [Microsoft.Lync.Model.LyncClient]::GetClient() 

#Set the client to reference to the local client 
$self = $client.Self 

# What do we do here? 
$conversationMgr = $client.ConversationManager 

# Register events for existing conversations. 

$i = 0 

for ($i=0; $i -lt $conversationMgr.Conversations.Count; $i++) { 

Register-ObjectEvent -InputObject $conversationMgr.Conversations[$i].Modalities[1] -EventName "InstantMessageReceived" ` 
        -SourceIdentifier "new im $i" ` 
        -action { 
           $message = $EventArgs.Text 
           Write-Host "DEBUG: New incoming IM - $message" 

           # Try to get the name of the person... 
           $contactInfo = $Event.Sender.Conversation.Participants[1].Contact.GetContactInformation([Microsoft.Lync.Model.ContactInformationType[]] @("FirstName", "LastName", "DisplayName", "PrimaryEmailAddress", "Photo", "IconUrl", "IconStream")) 
           $name = " " 
           if ($contactInfo.Get_Item("FirstName")) { $name = $contactInfo.Get_Item("FirstName") + " " + $contactInfo.Get_Item("LastName") + ":" } 
           elseif ($contactInfo.Get_Item("DisplayName")) { $name = $contactInfo.Get_Item("DisplayName") + ":"} 
           else { $name = $contactInfo.Get_Item("PrimaryEmailAddress") + ":" } 

           # We need to check if the Lync window (conversation?) has focus or not. 
           if (1) { 
            # We need to send our growl notification. 
            & 'C:\Program Files (x86)\Growl for Windows\growlnotify.exe' /a:Lync /n:new-im /t:"New Instant Message" "$name $message" 
           } 

          } 
} 

# If this exits, no more events. 
while (1) { } 

Каждый раз, когда я впечатать сообщение IM для кого-то другого, он делает то, что я пытаюсь сделать для входящих сообщений. Но ничто никогда не срабатывает для тех, кто просто уходит. Я прошел через всю документацию, и нет никаких других событий-кандидатов, я уверен, что это одно. Но объект Modality просто хранит некоторые вещи о том, является ли это чатом или экранизацией и т. П., Ничего полезного.

http://msdn.microsoft.com/en-us/library/lync/microsoft.lync.model.conversation.instantmessagemodality_di_3_uc_ocs14mreflyncclnt_members(v=office.14).aspx

Где я завинчивание на это? Я предпочитаю ответы в Powershell, но я не думаю, что это проблема, характерная для Powershell, поэтому, если вы знаете, как это сделать на C# или Visual Basic или что-то в этом роде, я тоже был бы признателен.

ответ

3

У меня нет Lync, поэтому я могу проверить это самостоятельно, но взгляните на this link, где показано, как использовать API.

Проблема (насколько я понимаю) заключается в том, что на каждого носителя имеется модальность. Таким образом, для разговора с двумя участниками, использующими только текст, будет два модальности: один для входящих сообщений (от удаленного участника) и один для исходящего. Это определено здесь, в

Происходит, когда мгновенное сообщение получено, или посылаться, если InstantMessageModality принадлежит местному участнику.

Источник: MSDN

При регистрации объекта-события, зарегистрировать его в «ваш модальность», а не с удаленного модальность. Чтобы исправить это, вам кажется, что вам нужно отвести каждый разговор от менеджера, посмотреть на каждого участника, кроме того, который представляет вас (проверьте свойство IsSelf). Затем возьмите модальность от участников (кроме себя) и зарегистрируйтесь для события InstantMessageReceived.

По крайней мере, это то, что я выбрал из этого, но, как сказал, у меня нет опыта с Lync, поэтому я легко ошибаюсь.

Моя догадка, как это можно сделать (ОЧЕНЬ непроверенные):

# What do we do here? You get the manager the keeps track of every conversation 
$conversationMgr = $client.ConversationManager 

# Register events for existing conversations. 

#You may need to use '$conversation in $conversationMgr.GetEnumerator()' 
foreach ($conversation in $conversationMgr) { 

    #Get remote participants 
    $conversation.Participants | where { !$_.IsSelf } | foreach { 
     #Get IM modality 
     $textmod = [InstantMessageModality]($_.Modalities[ModalityTypes.InstantMessage]) 

     Register-ObjectEvent -InputObject $textmod -EventName "InstantMessageReceived" ` 
        -SourceIdentifier "new im $i" ` 
        -action { 
          #... 

     } 
    } 
} 
+0

Спасибо за ответ, но если бы я сделать подсчет на условиях, я на самом деле получить 6. http://msdn.microsoft. com/en-us/library/microsoft.lync.model.conversation.modalitytypes_di_3_uc_ocs14mreflyncclnt.aspx Свойство модальности объекта беседы является одним из этих значений, оно не похоже на предмет для каждого участника. Я буду копаться в нем больше, хотя я бы не первый раз, когда я был немым. –

+0

Вы действительно правы. Для каждого участника есть объект «Модальность», а объект «Беседа» имеет свой собственный для себя участника. Теперь, когда я получаю доступ к правильному, я получаю то, что ожидаю. Спасибо. Я должен изучить несколько лучших способов отладки в Powershell, это заняло бы 10 секунд, если бы я мог просто увидеть список дочерних объектов для любого данного. –

+0

Рад, что я мог бы помочь. :) Был ли код правильным или вы каким-либо образом его модифицировали? Я бы хотел, чтобы в моем ответе был рабочий пример. –