Developing MSN/WLM Add-in Part.I

微软的Messenger SDK分为面向多人应用的Activity SDK和面向单人应用的 Add-in SDK(Windows Live Messenger Add-In API)。不过Live时代的WLM Add-In SDK相较于之前的MSN Messenger API,开放的接口反而少了。自微软实行.NET战略以来,Windows平台应用程序开发的主流逐渐由以往的VC++与Platform SDK搭配的方式转由.NET Framework与C#。然则.NET Framework由于设计的目的与一般普适的Platform SDK并不完全一致或者包容后者,在开发许多real world scenario 下的具体应用时,仍需要依赖Inter OP来使用现有COM组件的接口(关于.NET的本质是COM的论述,实际上也有不少相关文章可供参考,读者可自行利用谷歌雅虎百度搜寻,亦可于水木社区dotNET讨论区的精华文章中寻找。)

事实上,无论是新的WLM SDK,或者旧的Messenger API,皆是安装有WLM后才注册在系统中的COM组件。而WLM Add-in与MSN Messenger API最大的不同,就是开发语言必须是基于.NET Framework 2.0的C#,C++/CLI,VB#,J#,抑或IronPython等脚本语言。本文将会以一个实际的例子来探讨如何以C#来开发WLM的 Add-In。

要启用插件功能,首先需要修改注册表项。在HKCU\Software\Microsoft\MSNMessenger新建DWORD项,名为AddInFeatureEnabled,值设置为1。或者将以下四行文本存为reg文件导入。




Windows Registry Editor Version 5.00





[HKEY_CURRENT_USER\Software\Microsoft\MSNMessenger]


“AddInFeatureEnabled”=dword:00000001

修改了注册表之后,登录WLM,在Option菜单中就会出现Add-ins选项,点击Add to Messenger,找到Add-In dll就可以加载了

打开VS 2005(亦可使用Visual C# 2005 Express Edition),建立Class Library工程,名为WLMAddintest,添加引用Messenger API(Project,Add Reference,COM,Messenger API Type Library),添加引用Messenger Client(Project,Add Reference,Browse,C:\Program Files\MSN Messenger\MessengerClient.dll)。

将CS文件改名为test.cs,并新建一个名为TestFrm的新窗体。

更改输出assembly的文件名为WLMAddintest.Test(Project,WLMAddintest Properties,Application,Assembly Name)。因为WLM Add-In对于文件名有着严格的限制,必须是namespace.classname.dll的方式,否则将不能加载。当然你可以使用匿名命名空间,这样就可以只生成test.dll让WLM加载。

Frame代码先省略,其中test.cs代码如下:




using System;


using System.Collections.Generic;


using System.Text;


using System.Windows.Forms;


using Microsoft.Messenger;





namespace WLMAddintest


{


public class Test: IMessengerAddIn


{


public MessengerClient m_client;


public Form frm;


public void Initialize(MessengerClient client)


{


m_client = client;


m_client.Shutdown += new EventHandler(this.Shutdown);





m_client.AddInProperties.Url = new Uri(“http://dev.feuvan.net/“);


m_client.AddInProperties.FriendlyName = “test add-in”;


frm = new TestFrm();


frm.Show();


}


public void Shutdown(object sender, EventArgs e)


{


frm.Close();


}


}


}

在以上部分代码中,我们建立了一个名为test的类,实现了IMessengerAddIn接口,而Initialize则是Add-In的入口。另外我们绑定了Shutdown事件,Shutdown事件是在Add-In被unload,用户登出WLM或者关闭WLM发生的。读者可以使用VS的Object Browser来浏览MessengerClient提供的接口(选中Reference中的MessengerClient,双击或者右键View in Object Browser)。

MessengerClient类共有五种事件,皆可绑定到自己定义的事件响应函数上。





















事件



事件描述



参数描述



EventHandler
IncomingTextMessage



文本消息传入时发生



IncomingTextMessageEventArgs有两个属性


string TextMessage和User UserFrom



EventHandler
OutgoingTextMessage



文本消息传出时发生



OutgoingTextMessageEventArgs有两个属性


string TextMessage和User UserTo



EventHandler
ShowOptionsDialog



用户点击Add-In的Settings时发生



N/A



EventHandler
Shutdown



Add-In被unload时发生



N/A



EventHandler
StatusChanged



有用户的状态改变时发生,如登入登出。



StatusChangedEventArgs有一个属性


User User

其中User类的属性有昵称,email,个人状态信息,状态,唯一ID,并有一个方法GetGroupNames,可以得到用户所在的组名。

MessengerClient类有三种属性:















属性



限制



作用



AddInProperties
AddInProperties



读写



设置Add-In的信息如名称,作者,描述,URL等



User
LocalUser



只读



当前登录用户的属性,包括昵称,email,个人状态信息,状态,唯一ID



string
SavedState



读写



提供Add-In存储空间。


由于WLM Add-In的安全限制,Add-In不能访问本地文件。所以配置等信息可以串行化之后保存在SavedState变量中,下次启动从这里读取。

MessengerClient类有三个方法:











方法



作用



void
SendActionMessage(string
actionText, **Microsoft.Messenger.User
userTo)



发送动作

void SendNudgeMessage(Microsoft.Messenger.User
userTo)



发送震动信息

void SendTextMessage(string
text
, **Microsoft.Messenger.User
userTo)



发送文本

至于这里的User参数,基本上都是相应IncomingTextMessage的时候传进来的UserFrom参数。例如:




void messenger_IncomingTextMessage(object sender, IncomingTextMessageEventArgs e)


{


Microsoft.Messenger.User from = (Microsoft.Messenger.User)e.UserFrom;


messenger.SendTextMessage(output, from);


}

从上面的例子我们可以看到,WLM Add-In SDK还是很弱的,基本上只能拿来写机器人用,当然了,现在MSN机器人层出不穷,也不新鲜了。

接下来,就让我们来看看Messenger API能干点什么,以及更高级的话题。

后续内容更精彩,敬请继续关注。

see also: Developing MSN/WLM Add-in Part.II