<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><title type="html">Chris Mayo's Blog - Unified Communications Development</title><subtitle type="html">The Unified Communications Platform - Office Communications Server, Office Communicator, Exchange and the UC SDKs</subtitle><id>http://blogs.msdn.com/cmayo/atom.xml</id><link rel="alternate" type="text/html" href="http://blogs.msdn.com/cmayo/default.aspx" /><link rel="self" type="application/atom+xml" href="http://blogs.msdn.com/cmayo/atom.xml" /><generator uri="http://communityserver.org" version="2.1.61025.2">Community Server</generator><updated>2009-05-27T18:42:20Z</updated><entry><title>Unified Communications @ PDC09</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/cmayo/archive/2009/11/06/unified-communications-pdc09.aspx" /><id>http://blogs.msdn.com/cmayo/archive/2009/11/06/unified-communications-pdc09.aspx</id><published>2009-11-06T13:38:00Z</published><updated>2009-11-06T13:38:00Z</updated><content type="html">&lt;p&gt;I love the PDC.&amp;#160; Before I joined Microsoft in 2000, I went to every PDC so I could evaluate the future of the Microsoft platform and integrate it into my development and architecture.&lt;/p&gt;  &lt;p&gt;Since I joined the company, I’ve attended every PDC to share what we’re doing at Microsoft with regards to the future of the platform to start the conversation with other developers around feedback and early adoption.&lt;/p&gt;  &lt;p&gt;From either side of the conversation, it’s always been worth getting out of the office.&lt;/p&gt;  &lt;p&gt;Here are the 3 sessions we’ll have on the UC platform at PDC09:&lt;/p&gt;  &lt;h3&gt;&lt;a href="http://microsoftpdc.com/Sessions/P09-12"&gt;&lt;font size="3"&gt;Microsoft Unified Communications: Developer Platform Futures&lt;/font&gt;&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://microsoftpdc.com/Speakers/Chris-Mayo"&gt;Chris Mayo&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Learn how Microsoft Communications Server and Microsoft Exchange provide a comprehensive and flexible communications platform for developers. Get a first look at the next generation of this platform through a series of demos and code examples. See how to embed Communicator features in your application using new Microsoft Silverlight and Windows Presentation Foundation (WPF) controls, and learn about the new API to develop full custom clients for Communications Server. Also see how the UC Managed API 3.0 provides access to the new Voice-over-IP features of Communication Server.&lt;/p&gt;  &lt;h3&gt;&lt;a href="http://microsoftpdc.com/Sessions/PR13"&gt;&lt;font size="3"&gt;Integrating and Extending the Microsoft Office Communicator Experience with Windows Presentation Foundation and Microsoft Silverlight&lt;/font&gt;&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://microsoftpdc.com/Speakers/David-Ollason"&gt;David Ollason&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Come take an in-depth look at how to integrate and extend the Office Communicator experience into your Windows Presentation Foundation (WPF) and Silverlight applications. See how to provide the same integration experience as Office and Outlook including contact search, contact lists, presence, contact details and more. Learn how to pass contextual data from your application using the new contextual conversation API.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;&lt;a href="http://microsoftpdc.com/Sessions/PR30"&gt;&lt;font size="3"&gt;The Exchange 2010 Developer Story: Building Rich Exchange-enabled Applications for the Enterprise and the Cloud&lt;/font&gt;&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://microsoftpdc.com/Speakers/Jason-Henderson"&gt;Jason Henderson&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Learn how to make your application calendar or contact aware with the Exchange Web Services Managed API and Exchange Online. Get a first look at our new Exchange Web Services and Exchange Online developer story. See how developers can leverage the power of Azure and Exchange Web Services to create rich Software + Services solutions on Windows Presentation Foundation (WPF) or Microsoft Silverlight. Come learn how quick and easy it is to develop an Exchange Web Services application that can be deployed to millions of seats both on-premises and in the cloud.&lt;/p&gt;  &lt;p&gt;When I’m not speaking or attending the other UC platform sessions, I’ll be in the Expo or at the evening events.&amp;#160; &lt;/p&gt;  &lt;p&gt;I hope to see you &lt;a href="http://microsoftpdc.com/"&gt;there&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Thanks,&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Chris&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9918188" width="1" height="1"&gt;</content><author><name>cmayo</name><uri>http://blogs.msdn.com/members/cmayo.aspx</uri></author></entry><entry><title>My Schedule at TechEd Europe 2009</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/cmayo/archive/2009/11/05/my-schedule-at-teched-europe-2009.aspx" /><id>http://blogs.msdn.com/cmayo/archive/2009/11/05/my-schedule-at-teched-europe-2009.aspx</id><published>2009-11-05T19:27:41Z</published><updated>2009-11-05T19:27:41Z</updated><content type="html">&lt;p&gt;I’ll be at TechEd Europe this year speaking on the future of the UC platform (OCS, OC, Exchange and Outlook) and meeting up with my European friends and colleagues.&lt;/p&gt;  &lt;p&gt;I’m speaking at the following session:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;UNC304 The State of the Art in Microsoft's Unified Communications Developer Platform (*PDC at TechEd)&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Presenter: Chris Mayo&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Tue 11/10 | 17:00-18:15 | Paris 1 - Hall 7-1c&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Programmable Communications have become a reality over the last two years. Developers can now easily embed email, chat, and voice/video deeply into their software leveraging their .NET skills. This session gives an overview of the capabilities of the Microsoft Unified Communications platform and shows an in-depth code walk-through of key scenarios any developer can use in their software.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;When I’m not in that session, I’ll be at the Expo in the UC booth and hanging out at the various evening events.&lt;/p&gt;  &lt;p&gt;We’ve got over 60 sessions in the UC track this year for both developers and IT professionals (and those of us that do both).&amp;#160; You can get details on the track here:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.msteched.com/europe/public/sessionlist.aspx" href="http://www.msteched.com/europe/public/sessionlist.aspx"&gt;http://www.msteched.com/europe/public/sessionlist.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I hope to see you there.&lt;/p&gt;  &lt;p&gt;Thanks,&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Chris&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9918180" width="1" height="1"&gt;</content><author><name>cmayo</name><uri>http://blogs.msdn.com/members/cmayo.aspx</uri></author></entry><entry><title>Exchange 2010 and Exchange Web Services - What’s New Webcasts</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/cmayo/archive/2009/10/07/exchange-2010-and-exchange-web-services-what-s-new-webcasts.aspx" /><id>http://blogs.msdn.com/cmayo/archive/2009/10/07/exchange-2010-and-exchange-web-services-what-s-new-webcasts.aspx</id><published>2009-10-08T03:15:10Z</published><updated>2009-10-08T03:15:10Z</updated><content type="html">&lt;p&gt;Exchange Web Services gives you programmatic access to the information and business logic in Exchange 2010.&amp;#160; If you think about all the stuff you do in Outlook 2007 to manage your daily life (mail to communicate with friends and coworkers, calendar items to manage your day and tasks to track the things that you need to get done), all that information and business logic (think free/busy when scheduling a meeting) is provided by Exchange and accessible via the Exchange Web Services Managed API.&lt;/p&gt;  &lt;p&gt;This is a quick video with Jason Henderson and David Claux of the EWS team to show what you can do with the new EWS Managed API and what’s new in Exchange 2010 for developers.&lt;/p&gt; &lt;object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="320" height="240"&gt; &lt;param name="source" value="http://channel9.msdn.com/App_Themes/default/vp09_06_22.xap" /&gt; &lt;param name="initParams" value="m=http://ecn.channel9.msdn.com/o9/ch9/7/9/7/6/9/4/Ex2010EwsMa20091007_ch9.wmv,autostart=false,autohide=true,showembed=true, thumbnail=http://ecn.channel9.msdn.com/o9/ch9/7/9/7/6/9/4/Ex2010EwsMa20091007_320_ch9.png, postid=496797" /&gt; &lt;param name="background" value="#00FFFFFF" /&gt; &lt;a href="http://go.microsoft.com/fwlink/?LinkID=124807" style="text-decoration: none;"&gt; &lt;img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none" /&gt; &lt;/a&gt; &lt;/object&gt;  &lt;p&gt;Check out the following web casts to learn more.&amp;#160; &lt;/p&gt;  &lt;p&gt;10/13/2009 - &lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032427565&amp;amp;Culture=en-US"&gt;Exchange Server 2010 Development (Part 1 of 6): Migrating Applications to Exchange Web Services&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;10/14/2009 - &lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032427588&amp;amp;Culture=en-US"&gt;Exchange Server 2010 Development (Part 2 of 6): A Deep Dive into Using Autodiscover Service in Exchange Web Services&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;10/15/2009 - &lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032427593&amp;amp;Culture=en-US"&gt;Exchange Server 2010 Development (Part 3 of 6): A Deep Dive into Impersonation and Delegation in Exchange Web Services&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;10/20/2009 - &lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032427597&amp;amp;Culture=en-US"&gt;Exchange Server 2010 Development (Part 4 of 6): A Deep Dive into Exchange Web Services Notifications (Push/Pull)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;10/21/2009 - &lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032427601&amp;amp;Culture=en-US"&gt;Exchange Server 2010 Development (Part 5 of 6): A Deep Dive into the Exchange Web Services Managed API&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;10/22/2009 - &lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032427605&amp;amp;Culture=en-US"&gt;Exchange Server 2010 Development (Part 6 of 6): Best Practices for Building Scalable Exchange Server Applications&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032427605&amp;amp;Culture=en-US" target="_blank"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Thanks,&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Chris&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9904658" width="1" height="1"&gt;</content><author><name>cmayo</name><uri>http://blogs.msdn.com/members/cmayo.aspx</uri></author></entry><entry><title>How to get presence using Office Communicator SDK</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/cmayo/archive/2009/09/21/how-to-get-presence-using-office-communicator-sdk.aspx" /><id>http://blogs.msdn.com/cmayo/archive/2009/09/21/how-to-get-presence-using-office-communicator-sdk.aspx</id><published>2009-09-21T22:20:51Z</published><updated>2009-09-21T22:20:51Z</updated><content type="html">&lt;p&gt;Displaying the presence information for the local user or their contacts is a common scenario when adding Unified Communications features to your client applications.&amp;#160;&amp;#160; For example, after Office Communicator is installed, Outlook 2007 displays the presence of contacts on the To: and the From: line so the user can make intelligent communication decisions (“should I reply in email or are there enough people online that a concall would be better?”) directly in Outlook 2007.&lt;/p&gt;  &lt;p&gt;Luckily, it’s easy to integrate presence information into your client applications.&amp;#160; This video shows a great example:&lt;/p&gt; &lt;iframe style="width: 500px; height: 375px" src="http://silverlight.services.live.com/invoke/106091/OCSDK_ContactPresence/iframe.html" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;  &lt;p&gt;Let’s break down the code in the above video.&amp;#160; When displaying presence information, you need to get the initial value to display and then update your client UI when changes to presence elements occur.&amp;#160; In the code below, Messenger.GetContact() is used to get an instance of IMessengerContactAdvanced for displaying the initial presence information and the Messenger.OnMyStatusChange and Messenger.OnContactStatusChange events are used to get updated presence information:&lt;/p&gt; &lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;style type="text/css"&gt;






.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }&lt;/style&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Linq;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; CommunicatorAPI;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Runtime.InteropServices;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; ContactPresence&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    &lt;span class="kwrd"&gt;class&lt;/span&gt; Program&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Messenger _messenger;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;            _messenger = &lt;span class="kwrd"&gt;new&lt;/span&gt; Messenger();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;            _messenger.OnContactStatusChange += &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; DMessengerEvents_OnContactStatusChangeEventHandler(&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;                    _messenger_OnContactStatusChange);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;            _messenger.OnMyStatusChange += &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; DMessengerEvents_OnMyStatusChangeEventHandler(&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;                    _messenger_OnMyStatusChange);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;            IMessengerContactAdvanced localUser = &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;                (IMessengerContactAdvanced)_messenger.GetContact(&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;                _messenger.MySigninName, _messenger.MyServiceId);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (localUser != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;                DisplayContactPresence(localUser);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;            }   &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;\nPress Enter key to exit the application.\n&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;            Console.ReadLine();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;            _messenger.OnContactStatusChange -= &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; DMessengerEvents_OnContactStatusChangeEventHandler(&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;                    _messenger_OnContactStatusChange);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  41:  &lt;/span&gt;            _messenger.OnMyStatusChange -= &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  42:  &lt;/span&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; DMessengerEvents_OnMyStatusChangeEventHandler(&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  43:  &lt;/span&gt;                    _messenger_OnMyStatusChange);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  44:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  45:  &lt;/span&gt;            System.Runtime.InteropServices.Marshal.ReleaseComObject(_messenger);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  46:  &lt;/span&gt;            _messenger = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  47:  &lt;/span&gt;            System.Runtime.InteropServices.Marshal.ReleaseComObject(localUser);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  48:  &lt;/span&gt;            localUser = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  49:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;In order to display presence information, I’ve created a function called DisplayContactPresence.&amp;#160; This function uses IMessengerContactAdvanced.PresenceProperties to access the presence for a contact (their status, availability, presence note, etc.).&amp;#160; For example, the following code writes all the presence information for a contact out to the console:&lt;/p&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;style type="text/css"&gt;





.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; DisplayContactPresence(IMessengerContactAdvanced contact)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;            &lt;span class="kwrd"&gt;object&lt;/span&gt;[] presenceProps = (&lt;span class="kwrd"&gt;object&lt;/span&gt;[])contact.PresenceProperties;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (contact.IsSelf)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;                Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Local User Presence Info for {0}:&amp;quot;&lt;/span&gt;, &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;                    contact.FriendlyName);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;            &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;                Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Contact Presence Info for {0}:&amp;quot;&lt;/span&gt;, &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;                    contact.FriendlyName);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;            &lt;span class="rem"&gt;// Status or Machine State.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;\tStatus: {0}&amp;quot;&lt;/span&gt;, &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;                (MISTATUS)presenceProps[(&lt;span class="kwrd"&gt;int&lt;/span&gt;)PRESENCE_PROPERTY.PRESENCE_PROP_MSTATE]);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;\tStatus String: {0}&amp;quot;&lt;/span&gt;, &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;                GetStatusString((MISTATUS) presenceProps[(&lt;span class="kwrd"&gt;int&lt;/span&gt;)PRESENCE_PROPERTY.PRESENCE_PROP_MSTATE]));&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;            &lt;span class="rem"&gt;// Status string if status is set to custom.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;\tCustom Status String: {0}&amp;quot;&lt;/span&gt;, &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;                presenceProps[(&lt;span class="kwrd"&gt;int&lt;/span&gt;)PRESENCE_PROPERTY.PRESENCE_PROP_CUSTOM_STATUS_STRING]);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;            &lt;span class="rem"&gt;// Presence or User state.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;\tAvailability: {0}&amp;quot;&lt;/span&gt;, &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;                presenceProps[(&lt;span class="kwrd"&gt;int&lt;/span&gt;)PRESENCE_PROPERTY.PRESENCE_PROP_AVAILABILITY]);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;\tAvailability String: {0}&amp;quot;&lt;/span&gt;, &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;                GetAvailabilityString((&lt;span class="kwrd"&gt;int&lt;/span&gt;) presenceProps[(&lt;span class="kwrd"&gt;int&lt;/span&gt;)PRESENCE_PROPERTY.PRESENCE_PROP_AVAILABILITY]));&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;            &lt;span class="rem"&gt;// Presence note.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;\tPresence Note: \n'{0}'&amp;quot;&lt;/span&gt;, &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;                presenceProps[(&lt;span class="kwrd"&gt;int&lt;/span&gt;)PRESENCE_PROPERTY.PRESENCE_PROP_PRESENCE_NOTE]);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;            &lt;span class="rem"&gt;// Blocked status.  &lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;\tIs Blocked: {0}&amp;quot;&lt;/span&gt;, &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;                presenceProps[(&lt;span class="kwrd"&gt;int&lt;/span&gt;)PRESENCE_PROPERTY.PRESENCE_PROP_IS_BLOCKED]);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;            &lt;span class="rem"&gt;// OOF message for contact, if specified.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;\tIs OOF: {0}&amp;quot;&lt;/span&gt;, &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;                presenceProps[(&lt;span class="kwrd"&gt;int&lt;/span&gt;)PRESENCE_PROPERTY.PRESENCE_PROP_IS_OOF]);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;            &lt;span class="rem"&gt;// Tooltip.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  41:  &lt;/span&gt;            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;\tTool Tip: \n'{0}'\n&amp;quot;&lt;/span&gt;, &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  42:  &lt;/span&gt;                presenceProps[(&lt;span class="kwrd"&gt;int&lt;/span&gt;)PRESENCE_PROPERTY.PRESENCE_PROP_TOOL_TIP]);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  43:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  44:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  45:  &lt;/span&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; GetAvailabilityString(&lt;span class="kwrd"&gt;int&lt;/span&gt; availability)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  46:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  47:  &lt;/span&gt;            &lt;span class="kwrd"&gt;switch&lt;/span&gt; (availability)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  48:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  49:  &lt;/span&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; 3000:&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  50:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;Available&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  51:  &lt;/span&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; 4500:&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  52:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;Inactive&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  53:  &lt;/span&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; 6000:&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  54:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;Busy&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  55:  &lt;/span&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; 7500:&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  56:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;Busy-Idle&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  57:  &lt;/span&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; 9000:&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  58:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;Do not disturb&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  59:  &lt;/span&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; 12000:&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  60:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;Be right back&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  61:  &lt;/span&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; 15000:&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  62:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;Away&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  63:  &lt;/span&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; 18000:&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  64:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;Offline&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  65:  &lt;/span&gt;                &lt;span class="kwrd"&gt;default&lt;/span&gt;:&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  66:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  67:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  68:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  69:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  70:  &lt;/span&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; GetStatusString(MISTATUS mStatus)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  71:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  72:  &lt;/span&gt;            &lt;span class="kwrd"&gt;switch&lt;/span&gt; (mStatus)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  73:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  74:  &lt;/span&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; MISTATUS.MISTATUS_ALLOW_URGENT_INTERRUPTIONS:&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  75:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;Urgent interuptions only&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  76:  &lt;/span&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; MISTATUS.MISTATUS_AWAY:&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  77:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;Away&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  78:  &lt;/span&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; MISTATUS.MISTATUS_BE_RIGHT_BACK:&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  79:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;Be right back&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  80:  &lt;/span&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; MISTATUS.MISTATUS_BUSY:&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  81:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;Busy&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  82:  &lt;/span&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; MISTATUS.MISTATUS_DO_NOT_DISTURB:&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  83:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;Do no disturb&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  84:  &lt;/span&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; MISTATUS.MISTATUS_IDLE:&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  85:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;Idle&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  86:  &lt;/span&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; MISTATUS.MISTATUS_INVISIBLE:&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  87:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;Invisible&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  88:  &lt;/span&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; MISTATUS.MISTATUS_IN_A_CONFERENCE:&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  89:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;In a conference&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  90:  &lt;/span&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; MISTATUS.MISTATUS_IN_A_MEETING:&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  91:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;In a meeting&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  92:  &lt;/span&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; MISTATUS.MISTATUS_LOCAL_CONNECTING_TO_SERVER:&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  93:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;Connecting to server&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  94:  &lt;/span&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; MISTATUS.MISTATUS_LOCAL_DISCONNECTING_FROM_SERVER:&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  95:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;Disconnecting from server&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  96:  &lt;/span&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; MISTATUS.MISTATUS_LOCAL_FINDING_SERVER:&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  97:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;Finding server&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  98:  &lt;/span&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; MISTATUS.MISTATUS_LOCAL_SYNCHRONIZING_WITH_SERVER:&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  99:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;Synchronizing with server&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt; 100:  &lt;/span&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; MISTATUS.MISTATUS_MAY_BE_AVAILABLE:&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 101:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;Inactive&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt; 102:  &lt;/span&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; MISTATUS.MISTATUS_OFFLINE:&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 103:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;Offline&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt; 104:  &lt;/span&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; MISTATUS.MISTATUS_ONLINE:&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 105:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;Online&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt; 106:  &lt;/span&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; MISTATUS.MISTATUS_ON_THE_PHONE:&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 107:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;In a call&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt; 108:  &lt;/span&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; MISTATUS.MISTATUS_OUT_OF_OFFICE:&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 109:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;Out of office&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt; 110:  &lt;/span&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; MISTATUS.MISTATUS_OUT_TO_LUNCH:&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 111:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;Out to lunch&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt; 112:  &lt;/span&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; MISTATUS.MISTATUS_UNKNOWN:&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 113:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;Unknown&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt; 114:  &lt;/span&gt;                &lt;span class="kwrd"&gt;default&lt;/span&gt;:&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 115:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt; 116:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 117:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;When the presence of the local user or any of their contacts changes, the Messenger.OnMyStatusChange and Messenger.OnContactStatusChange events fire, respectively:&lt;/p&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;style type="text/css"&gt;



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; _messenger_OnMyStatusChange(&lt;span class="kwrd"&gt;int&lt;/span&gt; hr, MISTATUS mMyStatus)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;            &lt;span class="rem"&gt;// Your code to work with presence goes here...&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;\n***OnMyStatusChange***&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;            DisplayContactPresence((IMessengerContactAdvanced) &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;                _messenger.GetContact(_messenger.MySigninName, _messenger.MyServiceId));&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; _messenger_OnContactStatusChange(&lt;span class="kwrd"&gt;object&lt;/span&gt; pMContact, MISTATUS mStatus)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;            &lt;span class="rem"&gt;// Your code to work with presence goes here...&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;\n***OnContactStatusChange***&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;            DisplayContactPresence((IMessengerContactAdvanced) pMContact);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;One thing to note, both events have a MISTATUS value passed to provide the current status of the contact.&amp;#160; Using IMessengerContactAdvanced.PresenceProperties is preferred to using this value since it provides access to all the presence information for a contact, not just status.&lt;/p&gt;

&lt;p&gt;If you’d like to try this code out for yourself, you’ll need to &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=ED1CCE45-CC22-46E1-BD50-660FE6D2C98C&amp;amp;displaylang=en"&gt;download the Office Communicator 2007 SDK&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/cmayo/archive/2009/04/10/building-a-virtualized-uc-development-environment-part-1-building-the-ts-virtual-machine.aspx"&gt;setup a UC development environment&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=5001D612-533A-4721-91EA-DA990D94FF0F&amp;amp;displaylang=en" target="_blank"&gt;download the WPF Presence Controls for Office Communicator 2007&lt;/a&gt; example used in the first demo to see how this code is used in a solution.&lt;/p&gt;

&lt;p&gt;More details, tips and tricks on UC development can be found in the &lt;a href="http://www.amazon.com/Programming-Unified-Communications-Microsoft%C2%AE-Office/dp/0735626235/ref=sr_1_1?ie=UTF8&amp;amp;qid=1249960696&amp;amp;sr=8-1"&gt;Programming for Unified Communications&lt;/a&gt; book. &lt;/p&gt;

&lt;p&gt;Thanks,&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Chris&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9897703" width="1" height="1"&gt;</content><author><name>cmayo</name><uri>http://blogs.msdn.com/members/cmayo.aspx</uri></author></entry><entry><title>How to save IM conversations using Office Communicator SDK</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/cmayo/archive/2009/09/10/how-to-save-im-conversations-using-office-communicator-sdk.aspx" /><id>http://blogs.msdn.com/cmayo/archive/2009/09/10/how-to-save-im-conversations-using-office-communicator-sdk.aspx</id><published>2009-09-10T19:57:00Z</published><updated>2009-09-10T19:57:00Z</updated><content type="html">&lt;p&gt;Archiving the contents of an IM conversation using the Office Communicator SDK is something that I get asked about pretty routinely.&amp;#160; For example, let’s say that you want to launch an IM call from your application using the OC SDK and archive that conversation to be retrieved later (displaying all the application specific conversations in your application or on a SharePoint site, etc.).&lt;/p&gt;  &lt;p&gt;The OC SDK provides the IMessengerConversationWndAdvanced.History property to access the body of an IM conversation.&amp;#160; For example, the following console application launches an IM call and then writes out the IM history to the console:&lt;/p&gt; &lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;style type="text/css"&gt;



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }&lt;/style&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; History&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;class&lt;/span&gt; Program&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Messenger _messenger;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; IMessengerAdvanced _messengerAdv;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;long&lt;/span&gt; _myConvHWND = 0;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; IMessengerConversationWndAdvanced _myConv;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;            _messenger = &lt;span class="kwrd"&gt;new&lt;/span&gt; Messenger();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;            _messengerAdv = (IMessengerAdvanced)_messenger;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;            _messenger.OnIMWindowCreated +=&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; DMessengerEvents_OnIMWindowCreatedEventHandler(&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;                _messenger_OnIMWindowCreated);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;            _messenger.OnIMWindowDestroyed += &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; DMessengerEvents_OnIMWindowDestroyedEventHandler(&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;                _messenger_OnIMWindowDestroyed);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;            &lt;span class="kwrd"&gt;object&lt;/span&gt;[] sipUris = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[] { &lt;span class="str"&gt;&amp;quot;kf@fabrikam.com&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;cb@fabrikam.com&amp;quot;&lt;/span&gt;  };&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;            &lt;span class="kwrd"&gt;object&lt;/span&gt; obj = _messengerAdv.StartConversation(&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;                &lt;span class="rem"&gt;// The call media.            &lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;                CONVERSATION_TYPE.CONVERSATION_TYPE_IM,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;                &lt;span class="rem"&gt;// The participants.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;                sipUris,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;                &lt;span class="rem"&gt;// Not supported.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;                &lt;span class="kwrd"&gt;null&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;                &lt;span class="rem"&gt;// The conversation window title as as string.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;                &lt;span class="str"&gt;&amp;quot;Account: Johnson (ID:12345)&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;                &lt;span class="rem"&gt;// Not supported.  Pass &amp;quot;1&amp;quot;.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;                &lt;span class="str"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;                &lt;span class="rem"&gt;// Not supported.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;                &lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;            _myConvHWND = &lt;span class="kwrd"&gt;long&lt;/span&gt;.Parse(obj.ToString());&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  41:  &lt;/span&gt;            Console.WriteLine(&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  42:  &lt;/span&gt;                &lt;span class="str"&gt;&amp;quot;Press the Enter key to see IM conversation History.&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  43:  &lt;/span&gt;            Console.ReadLine();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  44:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  45:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (_myConv != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  46:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  47:  &lt;/span&gt;                &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  48:  &lt;/span&gt;                {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  49:  &lt;/span&gt;                    Console.WriteLine(_myConv.History);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  50:  &lt;/span&gt;                }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  51:  &lt;/span&gt;                &lt;span class="kwrd"&gt;catch&lt;/span&gt; (COMException ce)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  52:  &lt;/span&gt;                {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  53:  &lt;/span&gt;                    Console.WriteLine(&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  54:  &lt;/span&gt;                        &lt;span class="str"&gt;&amp;quot;COM Exception &amp;quot;&lt;/span&gt; + ce.ErrorCode.ToString());&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  55:  &lt;/span&gt;                }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  56:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  57:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  58:  &lt;/span&gt;            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Press the Enter key to exit the application.&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  59:  &lt;/span&gt;            Console.ReadLine();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  60:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  61:  &lt;/span&gt;            _messenger.OnIMWindowCreated -=&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  62:  &lt;/span&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; DMessengerEvents_OnIMWindowCreatedEventHandler(&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  63:  &lt;/span&gt;                _messenger_OnIMWindowCreated);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  64:  &lt;/span&gt;            _messenger.OnIMWindowDestroyed -=&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  65:  &lt;/span&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; DMessengerEvents_OnIMWindowDestroyedEventHandler(&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  66:  &lt;/span&gt;                _messenger_OnIMWindowDestroyed);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  67:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  68:  &lt;/span&gt;            Marshal.ReleaseComObject(_messenger);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  69:  &lt;/span&gt;            _messenger = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  70:  &lt;/span&gt;            Marshal.ReleaseComObject(_messengerAdv);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  71:  &lt;/span&gt;            _messengerAdv = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  72:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  73:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (_myConv != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  74:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  75:  &lt;/span&gt;                Marshal.ReleaseComObject(_myConv);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  76:  &lt;/span&gt;                _myConv = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  77:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  78:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;In the code above, I’m registering for the OnIMWindowCreated and OnIMWindowDestroyed events to get and release my reference to the conversation window (_myConv) so I can access the History property.&amp;#160; The code below shows how I manage the _myConv reference:&lt;/p&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; _messenger_OnIMWindowCreated(&lt;span class="kwrd"&gt;object&lt;/span&gt; pIMWindow)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;            IMessengerConversationWndAdvanced newConv =&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;                (IMessengerConversationWndAdvanced)pIMWindow;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (newConv.HWND == _myConvHWND)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;                newConv.SendText(&lt;span class="str"&gt;&amp;quot;This is a ongoing conversation &amp;quot;&lt;/span&gt; +&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;                    &lt;span class="str"&gt;&amp;quot;about the Account: Johnson (ID:12345) &amp;quot;&lt;/span&gt; +&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;                    &lt;span class="str"&gt;&amp;quot;and will be saved on the account site.&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;                &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;                _myConv = newConv;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; _messenger_OnIMWindowDestroyed(&lt;span class="kwrd"&gt;object&lt;/span&gt; pIMWindow)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;        {   &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;object&lt;/span&gt;.ReferenceEquals((&lt;span class="kwrd"&gt;object&lt;/span&gt;)_myConv, pIMWindow))&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;                Marshal.ReleaseComObject(_myConv);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;                _myConv = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;In OnIMWindowCreated, I set _myConv using the pIMWindow object passed as an event argument after confirming it’s the conversation I started in code (by comparing the HWNDs).&amp;#160; When OnIMWindowDestroyed fires, I check to make sure the window being destroyed is mine by using object.ReferenceEquals and release the reference.&amp;#160; Note that I can’t use the HWND property in OnIMWindowDestroyed since conversation window no longer exists and _myConv is no longer a valid reference.&lt;/p&gt;

&lt;p&gt;While this code works, it’s not an ideal solution.&amp;#160; I can’t rely on the user to do something (click a button, etc.) in my app before the conversation is closed.&amp;#160; I’d rather just write the IM conversation history out when the conversation is completed.&amp;#160; This leads a lot of developers to try the following:&lt;/p&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; _messenger_OnIMWindowDestroyed(&lt;span class="kwrd"&gt;object&lt;/span&gt; pIMWindow)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        {   &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;object&lt;/span&gt;.ReferenceEquals((&lt;span class="kwrd"&gt;object&lt;/span&gt;)_myConv, pIMWindow))&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;                Console.WriteLine(_myConv.History);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;                Marshal.ReleaseComObject(_myConv);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;                _myConv = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;But, the call to IMessengerConversationWndAdvanced.History throws an exception since _myConv is no longer a valid reference when OnIMWindowDestroyed fires.&lt;/p&gt;

&lt;p&gt;Another solution I’ve seen is polling History on another thread through the life of the conversation and writing out the last value when the conversation window is destroyed.&amp;#160; While this works, it’s less than ideal due to the resource you consume.&lt;/p&gt;

&lt;p&gt;So what does provide a good working scenario?&amp;#160; Creating a UCMA 2.0 IM robot that archives conversations and inviting that bot to all the conversations you want archived is a great solution (and a great future blog post).&lt;/p&gt;

&lt;p&gt;Details on how to start conversations using the Office Communicator SDK can be found in the &lt;a href="http://blogs.msdn.com/cmayo/archive/2009/08/20/how-to-make-calls-via-office-communicator-sdk.aspx"&gt;How to make calls via Office Communicator SDK&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/cmayo/archive/2009/08/29/how-to-send-im-text-using-office-communicator-sdk.aspx"&gt;How to send IM text using Office Communicator SDK&lt;/a&gt; posts on this blog.&lt;/p&gt;

&lt;p&gt;If you’d like to try this code out for yourself, you’ll need to &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=ED1CCE45-CC22-46E1-BD50-660FE6D2C98C&amp;amp;displaylang=en"&gt;download the Office Communicator 2007 SDK&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/cmayo/archive/2009/04/10/building-a-virtualized-uc-development-environment-part-1-building-the-ts-virtual-machine.aspx"&gt;setup a UC development environment&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;More details, tips and tricks on UC development can be found in the &lt;a href="http://www.amazon.com/Programming-Unified-Communications-Microsoft%C2%AE-Office/dp/0735626235/ref=sr_1_1?ie=UTF8&amp;amp;qid=1249960696&amp;amp;sr=8-1"&gt;Programming for Unified Communications&lt;/a&gt; book. &lt;/p&gt;

&lt;p&gt;Thanks,&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Chris&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9894406" width="1" height="1"&gt;</content><author><name>cmayo</name><uri>http://blogs.msdn.com/members/cmayo.aspx</uri></author><category term="UCMA 2.0" scheme="http://blogs.msdn.com/cmayo/archive/tags/UCMA+2.0/default.aspx" /><category term="OC 2007 R2" scheme="http://blogs.msdn.com/cmayo/archive/tags/OC+2007+R2/default.aspx" /><category term="OC 2007 SDK" scheme="http://blogs.msdn.com/cmayo/archive/tags/OC+2007+SDK/default.aspx" /></entry><entry><title>How to send IM text using Office Communicator SDK</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/cmayo/archive/2009/08/29/how-to-send-im-text-using-office-communicator-sdk.aspx" /><id>http://blogs.msdn.com/cmayo/archive/2009/08/29/how-to-send-im-text-using-office-communicator-sdk.aspx</id><published>2009-08-29T19:32:53Z</published><updated>2009-08-29T19:32:53Z</updated><content type="html">&lt;p&gt;When starting call from your application using the Office Communicator Automation API, it’s often helpful to send some IM text to provide some context for the call (often using data from your application).&amp;#160; For example, Outlook 2007 does this when you start a conversation using the IM and Call features from an email.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/cmayo/WindowsLiveWriter/HowtosendIMtextusingOfficeCommunicatorSD_7468/SendText_01_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="SendText_01" border="0" alt="SendText_01" src="http://blogs.msdn.com/blogfiles/cmayo/WindowsLiveWriter/HowtosendIMtextusingOfficeCommunicatorSD_7468/SendText_01_thumb.jpg" width="244" height="163" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;When the call is placed, Outlook 2007 uses the OC API to set the conversation window title and to provide details on the subject of the call (the email) via IM.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/cmayo/WindowsLiveWriter/HowtosendIMtextusingOfficeCommunicatorSD_7468/SendText_03_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="SendText_03" border="0" alt="SendText_03" src="http://blogs.msdn.com/blogfiles/cmayo/WindowsLiveWriter/HowtosendIMtextusingOfficeCommunicatorSD_7468/SendText_03_thumb.jpg" width="244" height="153" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Here is a quick video that shows how to send IM text using the Office Communicator Automation API:&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;iframe style="width: 500px; height: 375px" src="http://silverlight.services.live.com/invoke/106091/OCSDK_SendText/iframe.html" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;/p&gt;  &lt;p&gt;Let’s break down some of the details from the video.&amp;#160; First, the IMessengerAdvanced.StartConversation() method is used to start the call.&amp;#160; Once the call is accepted by the callee, a conversation window is created that I can use to send IM as part of the call. Due to the asynchronous nature of the OC API, this conversation window doesn’t get created right away.&amp;#160; Luckily, the StartConversation() method returns the HWND of the conversation window so I can identify it in code when it is created.&amp;#160; Registering for the OnIMWindowCreated event will give me access the conversation window when that happens.&amp;#160; For example, the following code registers for the OnIMWindowCreated event, starts a new audio call and stores the HWND of conversation window to be created in a local variable _myConvHWND:&lt;/p&gt; &lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }&lt;/style&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; StartConversation&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;class&lt;/span&gt; Program&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Messenger _messenger;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; IMessengerAdvanced _messengerAdv;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;long&lt;/span&gt; _myConvHWND = 0;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        {            &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;            _messenger = &lt;span class="kwrd"&gt;new&lt;/span&gt; Messenger();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;            _messengerAdv = (IMessengerAdvanced)_messenger;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;            _messenger.OnIMWindowCreated += &lt;span class="kwrd"&gt;new&lt;/span&gt; DMessengerEvents_OnIMWindowCreatedEventHandler(_messenger_OnIMWindowCreated);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;            &lt;span class="kwrd"&gt;object&lt;/span&gt;[] sipUris = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[] { &lt;span class="str"&gt;&amp;quot;kf@fabrikam.com&amp;quot;&lt;/span&gt; };&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;            &lt;span class="kwrd"&gt;object&lt;/span&gt; obj = _messengerAdv.StartConversation(&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;                &lt;span class="rem"&gt;// The call media.            &lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;                CONVERSATION_TYPE.CONVERSATION_TYPE_AUDIO,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;                &lt;span class="rem"&gt;// The participants.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;                sipUris,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;                &lt;span class="rem"&gt;// Not supported.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;                &lt;span class="kwrd"&gt;null&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;                &lt;span class="rem"&gt;// The conversation window title as as string.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;                &lt;span class="str"&gt;&amp;quot;My Audio Call with IM as Context&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;                &lt;span class="rem"&gt;// Not supported.  Pass &amp;quot;1&amp;quot;.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;                &lt;span class="str"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;                &lt;span class="rem"&gt;// Not supported.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;                &lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;            _myConvHWND = &lt;span class="kwrd"&gt;long&lt;/span&gt;.Parse(obj.ToString());&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Press the Enter key to exit the application.&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;            Console.ReadLine();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;            _messenger.OnIMWindowCreated -= &lt;span class="kwrd"&gt;new&lt;/span&gt; DMessengerEvents_OnIMWindowCreatedEventHandler(_messenger_OnIMWindowCreated);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;            Marshal.ReleaseComObject(_messenger);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  41:  &lt;/span&gt;            _messenger = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  42:  &lt;/span&gt;            Marshal.ReleaseComObject(_messengerAdv);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  43:  &lt;/span&gt;            _messengerAdv = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  44:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;When OnIMWindowCreated fires, it passes a reference to the conversation window via the IMessengerConversationWindowAdvanced interface.&amp;#160; I can use the HWND property on this interface to see if the conversation is the one I created with StartConversation() and send some IM using the SendText() method.&amp;#160; I need to check the HWND since OnIMWindowCreated will fire for every new conversation windows created by OC 2007 R2 (incoming or outgoing).&amp;#160; For example:&lt;/p&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; _messenger_OnIMWindowCreated(&lt;span class="kwrd"&gt;object&lt;/span&gt; pIMWindow)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;            IMessengerConversationWndAdvanced newConv = (IMessengerConversationWndAdvanced)pIMWindow;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (newConv.HWND == _myConvHWND)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;                newConv.SendText(&lt;span class="str"&gt;&amp;quot;This IM was sent via SendText()...&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Using the SendText() method to provide some application data in the IM channel is a great way to add value to the calls you launch from your application.&amp;#160; Using the Outlook 2007/Office Communicator 2007 R2 integration as an example, you can start to think of ways that you can provide context to the calls your application launches using data from your application.&lt;/p&gt;

&lt;p&gt;If you’d like to try this code out for yourself, you’ll need to &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=ED1CCE45-CC22-46E1-BD50-660FE6D2C98C&amp;amp;displaylang=en"&gt;download the Office Communicator 2007 SDK&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/cmayo/archive/2009/04/10/building-a-virtualized-uc-development-environment-part-1-building-the-ts-virtual-machine.aspx"&gt;setup a UC development environment&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;More details, tips and tricks on UC development can be found in the &lt;a href="http://www.amazon.com/Programming-Unified-Communications-Microsoft%C2%AE-Office/dp/0735626235/ref=sr_1_1?ie=UTF8&amp;amp;qid=1249960696&amp;amp;sr=8-1"&gt;Programming for Unified Communications&lt;/a&gt; book. &lt;/p&gt;

&lt;p&gt;Thanks,&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Chris&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9888972" width="1" height="1"&gt;</content><author><name>cmayo</name><uri>http://blogs.msdn.com/members/cmayo.aspx</uri></author><category term="OC 2007 R2" scheme="http://blogs.msdn.com/cmayo/archive/tags/OC+2007+R2/default.aspx" /><category term="OC 2007 SDK" scheme="http://blogs.msdn.com/cmayo/archive/tags/OC+2007+SDK/default.aspx" /></entry><entry><title>How to make calls via Office Communicator SDK</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/cmayo/archive/2009/08/20/how-to-make-calls-via-office-communicator-sdk.aspx" /><id>http://blogs.msdn.com/cmayo/archive/2009/08/20/how-to-make-calls-via-office-communicator-sdk.aspx</id><published>2009-08-21T03:53:00Z</published><updated>2009-08-21T03:53:00Z</updated><content type="html">&lt;p&gt;Starting Office Communicator calls from your code is one of the simplest and most powerful features you can add to your application using the Office Communicator Automation API.&amp;#160; &lt;/p&gt;  &lt;p&gt;This video shows some examples of the types of calls you can start in your code:&lt;/p&gt; &lt;iframe style="width: 500px; height: 375px" src="http://silverlight.services.live.com/invoke/106091/Office%20Communicator%20SDK%20-%20Start%20Conversation/iframe.html" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;  &lt;p&gt;Let’s dive into the code.&amp;#160; When making calls via the Office Communicator Automation API you call the IMessengerAdvanced.StartConversation() method and specify the participants, the media type (IM, audio, video) and any call specific information (such as the conversation window title).&amp;#160; You get a reference to the IMessengerAdvanced interface by casting an instance of Messenger class.&lt;/p&gt;  &lt;p&gt;For example, the following console application code starts an IM call with a single contact (kf@fabrikam.com) and sets the title of the conversation window to “My IM Call”:&lt;/p&gt; &lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;style type="text/css"&gt;







.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }&lt;/style&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Linq;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; CommunicatorAPI;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Runtime.InteropServices;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; StartConversation&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    &lt;span class="kwrd"&gt;class&lt;/span&gt; Program&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Messenger _messenger;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; IMessengerAdvanced _messengerAdv;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;            _messenger = &lt;span class="kwrd"&gt;new&lt;/span&gt; Messenger();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;            _messengerAdv = (IMessengerAdvanced)_messenger;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;            &lt;span class="kwrd"&gt;object&lt;/span&gt;[] sipUris = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[] { &lt;span class="str"&gt;&amp;quot;kf@fabrikam.com&amp;quot;&lt;/span&gt; };&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;            _messengerAdv.StartConversation(&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;                &lt;span class="rem"&gt;// The call media.            &lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;                CONVERSATION_TYPE.CONVERSATION_TYPE_IM,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;                &lt;span class="rem"&gt;// The participants.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;                sipUris,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;                &lt;span class="rem"&gt;// Not supported.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;                &lt;span class="kwrd"&gt;null&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;                &lt;span class="rem"&gt;// The conversation window title as as string.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;                &lt;span class="str"&gt;&amp;quot;My IM Call&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;                &lt;span class="rem"&gt;// Not supported.  Pass &amp;quot;1&amp;quot;.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;                &lt;span class="str"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;                &lt;span class="rem"&gt;// Not supported.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;                &lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Press the Enter key to exit the application.&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;            Console.ReadLine();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;            Marshal.ReleaseComObject(_messenger);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  41:  &lt;/span&gt;            _messenger = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  42:  &lt;/span&gt;            Marshal.ReleaseComObject(_messengerAdv);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  43:  &lt;/span&gt;            _messengerAdv = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  44:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  45:  &lt;/span&gt;    }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  46:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Changing the call media is just a matter of passing a different value from the CONVERSATION_TYPE enum.&amp;#160; For example, the follow code starts an audio call:&lt;/p&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;style type="text/css"&gt;






.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;            _messengerAdv.StartConversation(&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;                &lt;span class="rem"&gt;// The call media.            &lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;                CONVERSATION_TYPE.CONVERSATION_TYPE_AUDIO,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;                &lt;span class="rem"&gt;// The participants.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;                sipUris,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;                &lt;span class="rem"&gt;// Not supported.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;                &lt;span class="kwrd"&gt;null&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;                &lt;span class="rem"&gt;// The conversation window title as as string.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;                &lt;span class="str"&gt;&amp;quot;My Audio Call&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;                &lt;span class="rem"&gt;// Not supported.  Pass &amp;quot;1&amp;quot;.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;                &lt;span class="str"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;                &lt;span class="rem"&gt;// Not supported.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;                &lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Starting a conference is just a matter of starting a call with multiple participants.&amp;#160; For example, the following code starts a video conference:&lt;/p&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;            &lt;span class="kwrd"&gt;object&lt;/span&gt;[] sipUris = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[] { &lt;span class="str"&gt;&amp;quot;kf@fabrikam.com&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;cb@fabrikam.com&amp;quot;&lt;/span&gt; };&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;            _messengerAdv.StartConversation(&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;                &lt;span class="rem"&gt;// The call media.            &lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;                CONVERSATION_TYPE.CONVERSATION_TYPE_VIDEO,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;                &lt;span class="rem"&gt;// The participants.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;                sipUris,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;                &lt;span class="rem"&gt;// Not supported.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;                &lt;span class="kwrd"&gt;null&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;                &lt;span class="rem"&gt;// The conversation window title as as string.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;                &lt;span class="str"&gt;&amp;quot;My Video Conference&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;                &lt;span class="rem"&gt;// Not supported.  Pass &amp;quot;1&amp;quot;.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;                &lt;span class="str"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;                &lt;span class="rem"&gt;// Not supported.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;                &lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;If you’d like to try this code out for yourself, you’ll need to &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=ED1CCE45-CC22-46E1-BD50-660FE6D2C98C&amp;amp;displaylang=en"&gt;download the Office Communicator 2007 SDK&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/cmayo/archive/2009/04/10/building-a-virtualized-uc-development-environment-part-1-building-the-ts-virtual-machine.aspx"&gt;setup a UC development environment&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;More details, tips and tricks on UC development can be found in the &lt;a href="http://www.amazon.com/Programming-Unified-Communications-Microsoft%C2%AE-Office/dp/0735626235/ref=sr_1_1?ie=UTF8&amp;amp;qid=1249960696&amp;amp;sr=8-1"&gt;Programming for Unified Communications&lt;/a&gt; book. &lt;/p&gt;

&lt;p&gt;Thanks,&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Chris&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9877972" width="1" height="1"&gt;</content><author><name>cmayo</name><uri>http://blogs.msdn.com/members/cmayo.aspx</uri></author></entry><entry><title>Exchange 2010 RC available now</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/cmayo/archive/2009/08/19/exchange-2010-rc-available-now.aspx" /><id>http://blogs.msdn.com/cmayo/archive/2009/08/19/exchange-2010-rc-available-now.aspx</id><published>2009-08-19T23:03:00Z</published><updated>2009-08-19T23:03:00Z</updated><content type="html">&lt;p&gt;Details can be found at the &lt;a href="http://msexchangeteam.com/default.aspx" target="_blank"&gt;Exchange Team Blog&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Thanks,&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Chris&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9874643" width="1" height="1"&gt;</content><author><name>cmayo</name><uri>http://blogs.msdn.com/members/cmayo.aspx</uri></author></entry><entry><title>Microsoft LifeCam Cinema 720p HD webcam</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/cmayo/archive/2009/08/19/microsoft-lifecam-cinema-720p-hd-webcam.aspx" /><id>http://blogs.msdn.com/cmayo/archive/2009/08/19/microsoft-lifecam-cinema-720p-hd-webcam.aspx</id><published>2009-08-19T22:26:00Z</published><updated>2009-08-19T22:26:00Z</updated><content type="html">&lt;p&gt;HD support is coming to webcams.&amp;#160; Understandably, I spend a lot of time in virtual meetings in front of a webcam and lately I’ve been looking for something that would, well, improve my image (no pun intended).&lt;/p&gt;  &lt;p&gt;News of the new LifeCam Cinema with HD support hit the gadget sites today.&amp;#160; Honestly, I plan on getting one of these as soon as they come out (if I can’t score one earlier, that is).&amp;#160; Now I just need to do something about the light in my office, which tends to make me look a bit ‘undead’.&lt;/p&gt;  &lt;p&gt;You can find &lt;a href="http://www.ubergizmo.com/15/archives/2009/08/microsoft_lifecam_cinema.html" target="_blank"&gt;details on the LifeCam Cinema&lt;/a&gt; in this post.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9874624" width="1" height="1"&gt;</content><author><name>cmayo</name><uri>http://blogs.msdn.com/members/cmayo.aspx</uri></author></entry><entry><title>PDC09 registration open, Unified Communications Futures session posted</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/cmayo/archive/2009/08/18/pdc09-registration-open-unified-communications-futures-session-posted.aspx" /><id>http://blogs.msdn.com/cmayo/archive/2009/08/18/pdc09-registration-open-unified-communications-futures-session-posted.aspx</id><published>2009-08-18T23:01:36Z</published><updated>2009-08-18T23:01:36Z</updated><content type="html">&lt;p&gt;Before I joined Microsoft back in 2000, if I could only attend one conference a year it would be the PDC.&amp;#160; The opportunity to get a firsthand look at the future of the Microsoft platform and provide feedback directly to the product teams just couldn’t be passed up.&amp;#160; Other conferences do a great job showing how to get things done today, the PDC is all about how to get things done in the future.&amp;#160; &lt;/p&gt;  &lt;p&gt;Now that I’m with Microsoft and in a role where I focus on the future of the Unified Communications Platform, I feel the same way.&amp;#160; I wouldn’t miss PDC09 for anything.&amp;#160; At the PDC last year, we shared details on the platform we released along with Office Communications Server 2007 R2 and Exchange 2010 and provided details on v.Next.&lt;/p&gt;  &lt;p&gt;At PDC09, we’ll share specific details v.Next, including the UC product futures (including Office Communications Server, Office Communicator and Exchange) and platform futures (both client and server side) as well as sharing details on early adopter programs.&lt;/p&gt;  &lt;p&gt;Details on &lt;a href="http://microsoftpdc.com/Registration" target="_blank"&gt;registering for PDC09&lt;/a&gt; and the &lt;a href="http://microsoftpdc.com/Sessions/P09-12"&gt;Microsoft Unified Communications: Developer Platform Futures&lt;/a&gt; can be found on the &lt;a href="http://microsoftpdc.com/" target="_blank"&gt;PDC09 site&lt;/a&gt;.&amp;#160; You can watch the &lt;a href="http://channel9.msdn.com/pdc2008/BB09/" target="_blank"&gt;UC futures session at PDC08&lt;/a&gt; to get a hint of what is coming.&lt;/p&gt;  &lt;p&gt;Let’s get together while we’re there.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Thanks,&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Chris.&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9874488" width="1" height="1"&gt;</content><author><name>cmayo</name><uri>http://blogs.msdn.com/members/cmayo.aspx</uri></author><category term="UCMA 2.0" scheme="http://blogs.msdn.com/cmayo/archive/tags/UCMA+2.0/default.aspx" /><category term="OCS 2007 R2" scheme="http://blogs.msdn.com/cmayo/archive/tags/OCS+2007+R2/default.aspx" /><category term="OC 2007 R2" scheme="http://blogs.msdn.com/cmayo/archive/tags/OC+2007+R2/default.aspx" /><category term="OC 2007 SDK" scheme="http://blogs.msdn.com/cmayo/archive/tags/OC+2007+SDK/default.aspx" /><category term="PDC09" scheme="http://blogs.msdn.com/cmayo/archive/tags/PDC09/default.aspx" /></entry><entry><title>What’s new in Office Communicator Mobile 2007 R2?</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/cmayo/archive/2009/08/14/what-s-new-in-office-communicator-mobile-2007-r2.aspx" /><id>http://blogs.msdn.com/cmayo/archive/2009/08/14/what-s-new-in-office-communicator-mobile-2007-r2.aspx</id><published>2009-08-14T15:18:00Z</published><updated>2009-08-14T15:18:00Z</updated><content type="html">&lt;p&gt;A nice write up of the new OC Mobile 2007 R2 features, including:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Joining OCS hosted conferences with one click.&lt;/li&gt;    &lt;li&gt;Making outbound calls via your work number.&lt;/li&gt;    &lt;li&gt;Windows Mobile 6.5 support.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Check out the &lt;a href="http://communicatorteam.com/archive/2009/08/03/864.aspx" target="_blank"&gt;Office Communicator Just Got Better&lt;/a&gt; post on the &lt;a href="http://communicatorteam.com/" target="_blank"&gt;Communicator Team Blog&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9869039" width="1" height="1"&gt;</content><author><name>cmayo</name><uri>http://blogs.msdn.com/members/cmayo.aspx</uri></author><category term="OC 2007 R2" scheme="http://blogs.msdn.com/cmayo/archive/tags/OC+2007+R2/default.aspx" /></entry><entry><title>Getting sign in/sign out status via Office Communicator 2007 SDK</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/cmayo/archive/2009/08/13/getting-sign-in-sign-out-status-via-office-communicator-2007-sdk.aspx" /><id>http://blogs.msdn.com/cmayo/archive/2009/08/13/getting-sign-in-sign-out-status-via-office-communicator-2007-sdk.aspx</id><published>2009-08-14T02:44:23Z</published><updated>2009-08-14T02:44:23Z</updated><content type="html">&lt;p&gt;When using the Office Communicator 2007 SDK, you need to make sure that OC is running and signed in before you use classes from the SDK.&amp;#160; I often get email from developers new to the OC SDK who are getting errors when they try to debug their first applications.&amp;#160; For example, if OC 2007 R2 is not running on the client machine, you’ll get the following COMException when you try to create a instance of the Messenger class:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;“Creating an instance of the COM component with CLSID {8885370D-B33E-44B7-875D-28E403CF9270} from the IClassFactory failed due to the following error: 80040111.”&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Or, if Office Communicator is running but the user has not signed in, you’ll get the following error trying to access your instance of the Messenger class:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;“Exception from HRESULT: 0x8100031E” (an error code that translates to not logged on if you refer to the OC SDK documentation).&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;So, how do you make sure OC 2007 R2 is running and signed in before you enable your OC SDK features (and disable them when that status changes)?&amp;#160; &lt;/p&gt;  &lt;p&gt;This video shows as example of this in a simple console application:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Chris – Added video.&lt;/em&gt;&lt;/p&gt; &lt;iframe style="width: 500px; height: 375px" src="http://silverlight.services.live.com/invoke/106091/Office%20Communicator%20SDK%20-%20Office%20Communicator%20State/iframe.html" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;  &lt;p&gt;To see if Office Communicator is running, read the &lt;em&gt;HKEY_CURRENT_USER\Software\IM Providers\Communicator\UpAndRunning&lt;/em&gt; value via code:&lt;/p&gt; &lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;style type="text/css"&gt;









.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }&lt;/style&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; IsCommunicatorRunning()&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; Convert.ToInt32(Microsoft.Win32.Registry.CurrentUser&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;                            .OpenSubKey(&lt;span class="str"&gt;&amp;quot;Software&amp;quot;&lt;/span&gt;).OpenSubKey(&lt;span class="str"&gt;&amp;quot;IM Providers&amp;quot;&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;                            .OpenSubKey(&lt;span class="str"&gt;&amp;quot;Communicator&amp;quot;&lt;/span&gt;).GetValue(&lt;span class="str"&gt;&amp;quot;UpAndRunning&amp;quot;&lt;/span&gt;, 1)) == 2;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;If this registry value is 2, OC is up and running and you’re able to create instances of Messenger class.&amp;#160; Messenger class can be used to wire up events to track changes to Office Communicator or the sign in status of the local user and query the initial sign in status of the local user.&amp;#160; For example, the following code does just that:&lt;/p&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;style type="text/css"&gt;









.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Messenger _messenger;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; _signedIn = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (IsCommunicatorRunning())&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;                _messenger = &lt;span class="kwrd"&gt;new&lt;/span&gt; Messenger();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;                _messenger.OnAppShutdown += &lt;span class="kwrd"&gt;new&lt;/span&gt; DMessengerEvents_OnAppShutdownEventHandler(_messenger_OnAppShutdown);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;                _messenger.OnSignin += &lt;span class="kwrd"&gt;new&lt;/span&gt; DMessengerEvents_OnSigninEventHandler(_messenger_OnSignin);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;                _messenger.OnSignout += &lt;span class="kwrd"&gt;new&lt;/span&gt; DMessengerEvents_OnSignoutEventHandler(_messenger_OnSignout);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; ((_messenger.MyStatus &amp;amp; MISTATUS.MISTATUS_ONLINE) == MISTATUS.MISTATUS_ONLINE)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;                {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;                    _signedIn = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;                }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;                &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;                {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;                    _signedIn = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;                }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;                Console.WriteLine(&lt;span class="str"&gt;&amp;quot;\nPress Enter key to exit the application.\n&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;                Console.ReadLine();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;                _messenger.OnAppShutdown -= &lt;span class="kwrd"&gt;new&lt;/span&gt; DMessengerEvents_OnAppShutdownEventHandler(_messenger_OnAppShutdown);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;                _messenger.OnSignin -= &lt;span class="kwrd"&gt;new&lt;/span&gt; DMessengerEvents_OnSigninEventHandler(_messenger_OnSignin);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;                _messenger.OnSignout -= &lt;span class="kwrd"&gt;new&lt;/span&gt; DMessengerEvents_OnSignoutEventHandler(_messenger_OnSignout);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;                Marshal.ReleaseComObject(_messenger);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;                _messenger = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;The following line sets the initial value of the _signedIn by using Messenger.MyStatus and the &amp;amp; operator, evaluating to true if the local user is in any of the online states (any value other than Offline or Unknown including Online, In a Call, etc.):&lt;/p&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;style type="text/css"&gt;








.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; ((_messenger.MyStatus &amp;amp; MISTATUS.MISTATUS_ONLINE) == MISTATUS.MISTATUS_ONLINE)&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;The _signedIn value is kept up to date via the Messenger class events for signed in status:&lt;/p&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;style type="text/css"&gt;







.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; _messenger_OnSignout()&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;            _signedIn = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; _messenger_OnSignin(&lt;span class="kwrd"&gt;int&lt;/span&gt; hr)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (hr == 0)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;                _signedIn = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; _messenger_OnAppShutdown()&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Note: OnSignOut will always fire before OnAppShutdown, so setting _signedIn to false during OnSignOut is enough to keep your application up to date.&lt;/p&gt;

&lt;p&gt;If you’d like to try this code out for yourself, you’ll need to &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=ED1CCE45-CC22-46E1-BD50-660FE6D2C98C&amp;amp;displaylang=en" target="_blank"&gt;download the Office Communicator 2007 SDK&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/cmayo/archive/2009/04/10/building-a-virtualized-uc-development-environment-part-1-building-the-ts-virtual-machine.aspx" target="_blank"&gt;setup a UC development environment&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;More details, tips and tricks on UC development can be found in the &lt;a href="http://www.amazon.com/Programming-Unified-Communications-Microsoft%C2%AE-Office/dp/0735626235/ref=sr_1_1?ie=UTF8&amp;amp;qid=1249960696&amp;amp;sr=8-1" target="_blank"&gt;Programming for Unified Communications&lt;/a&gt; book.&amp;#160; &lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Thanks, &lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Chris&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9869036" width="1" height="1"&gt;</content><author><name>cmayo</name><uri>http://blogs.msdn.com/members/cmayo.aspx</uri></author></entry><entry><title>Programming for Unified Communications with Microsoft® Office Communications Server 2007 R2 is Available Now!</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/cmayo/archive/2009/06/05/programming-for-unified-communications-with-microsoft-office-communications-server-2007-r2-is-available-now.aspx" /><id>http://blogs.msdn.com/cmayo/archive/2009/06/05/programming-for-unified-communications-with-microsoft-office-communications-server-2007-r2-is-available-now.aspx</id><published>2009-06-05T21:09:24Z</published><updated>2009-06-05T21:09:24Z</updated><content type="html">&lt;p&gt;The book is now available.&amp;#160; When writing this book, we wanted to create a single reference for getting started with UC development quickly as well as providing the insight, guidance and tips and tricks necessary to help your projects succeed.&amp;#160; I’m really happy with the result.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;I was amazed how much I learned across the different APIs while searching for the pivotal nuggets of information to include in the book.&amp;#160; I hope you enjoy reading it as much as I enjoyed writing it!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Thanks,&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Chris&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9701716" width="1" height="1"&gt;</content><author><name>cmayo</name><uri>http://blogs.msdn.com/members/cmayo.aspx</uri></author></entry><entry><title>Programming for Unified Communications Excerpts now on MS Press Blog</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/cmayo/archive/2009/06/01/programming-for-unified-communications-excerpts-now-on-ms-press-blog.aspx" /><id>http://blogs.msdn.com/cmayo/archive/2009/06/01/programming-for-unified-communications-excerpts-now-on-ms-press-blog.aspx</id><published>2009-06-01T20:30:36Z</published><updated>2009-06-01T20:30:36Z</updated><content type="html">&lt;p&gt;If you’d like a taste of the book, check out some excerpts &lt;a href="http://blogs.msdn.com/microsoft_press/archive/2009/05/28/new-book-programming-for-unified-communications-with-microsoft-office-communications-server-2007-r2.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The book has not been released yet, but it available for preorder just about everywhere geeky/techy books are sold, like &lt;a href="http://www.amazon.com/gp/product/0735626235/ref=s9_simz_gw_s0_p14_i1?pf_rd_m=ATVPDKIKX0DER&amp;amp;pf_rd_s=center-2&amp;amp;pf_rd_r=05QHVTR7CJ4VNV6Y773G&amp;amp;pf_rd_t=101&amp;amp;pf_rd_p=470938631&amp;amp;pf_rd_i=507846" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Thanks,&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Chris&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9678691" width="1" height="1"&gt;</content><author><name>cmayo</name><uri>http://blogs.msdn.com/members/cmayo.aspx</uri></author></entry><entry><title>We’d like your feedback…</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/cmayo/archive/2009/05/27/we-d-like-your-feedback.aspx" /><id>http://blogs.msdn.com/cmayo/archive/2009/05/27/we-d-like-your-feedback.aspx</id><published>2009-05-28T02:42:20Z</published><updated>2009-05-28T02:42:20Z</updated><content type="html">&lt;p&gt;If you attended my session on the Office Communicator Automation API, I’m going to be posting the community project for this API on CodePlex soon.&amp;#160; The rest of the community project team and I are reviewing/discussing some last minute details…&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;In the mean time, we’d like to get your feedback on what it’s like to be a developer using the Unified Communication platform SDKs.&amp;#160; We’ve put together a short survey with Frost and Sullivan to make it as easy as possible for you to give us feedback.&amp;#160; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;For example, what UC applications have you developed?&amp;#160; What communication features or scenarios are most important to you? What other communications tools besides Microsoft’s Unified Communications products (like Office Communications Server, Office Communicator and Exchange) are you using?&amp;#160; What could we do could do to better help the UC developer community?&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;If you are a developer of Unified Communications applications such as OCS and Communicator, we’d appreciate you taking 10 minutes and to fill out this survey:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.globaltestmarket.com/survey/s.phtml?sn=134581&amp;amp;lang=E&amp;amp;secid=9f8cbb"&gt;http://www.globaltestmarket.com/survey/s.phtml?sn=134581&amp;amp;lang=E&amp;amp;secid=9f8cbb&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;When you click the link you will be directed to a secured site hosted by Frost and Sullivan to fill out the survey.&amp;#160; The site requires cookies to be enabled.&amp;#160; Your individual responses will be kept confidential and anonymous.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;We’ll use the results of this survey to shape our plans around developing resources to help you build enterprise software using the Microsoft Unified Communications platform.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Thanks,&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Chris&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9645148" width="1" height="1"&gt;</content><author><name>cmayo</name><uri>http://blogs.msdn.com/members/cmayo.aspx</uri></author></entry></feed>