微软的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