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<IncomingTextMessageEventArgs> |
文本消息传入时发生 |
IncomingTextMessageEventArgs有两个属性 string TextMessage和User UserFrom |
|
EventHandler<OutgoingTextMessageEventArgs> |
文本消息传出时发生 |
OutgoingTextMessageEventArgs有两个属性 string TextMessage和User UserTo |
|
EventHandler |
用户点击Add-In的Settings时发生 |
N/A |
|
EventHandler |
Add-In被unload时发生 |
N/A |
|
EventHandler<StatusChangedEventArgs> |
有用户的状态改变时发生,如登入登出。 |
StatusChangedEventArgs有一个属性 User User |
其中User类的属性有昵称,email,个人状态信息,状态,唯一ID,并有一个方法GetGroupNames,可以得到用户所在的组名。
MessengerClient类有三种属性:
|
属性 |
限制 |
作用 |
|
AddInProperties |
读写 |
设置Add-In的信息如名称,作者,描述,URL等 |
|
User |
只读 |
当前登录用户的属性,包括昵称,email,个人状态信息,状态,唯一ID |
|
string |
读写 |
提供Add-In存储空间。 由于WLM Add-In的安全限制,Add-In不能访问本地文件。所以配置等信息可以串行化之后保存在SavedState变量中,下次启动从这里读取。 |
MessengerClient类有三个方法:
|
方法 |
作用 |
|
void |
发送动作 |
|
void |
发送震动信息 |
|
void |
发送文本 |
至于这里的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
早点
昨天和今天一样起得很早,
在小区外的集天小吃吃了多年未吃的早点。
一日三餐,作息规律还是很舒服的。
就是脑子不太好用,
因为我最近一直在想xxx该怎么实现,
梦里都是一段一段的代码,
走火入魔了。
以前努力读书的时候,我是说初中高中,
经常做梦在那里做数学题。
远方的某姐要搬家,
看她blog写的颠沛流离的状况,
不由想起很多很多事情。
为谁辛苦为谁忙。
Ok,我离题了。
我现在就去吃早点。
农历新年第一篇
身体差不多好了,但是作息昼夜颠倒了。继续和OVAL死磕,等next OVAL dev day,patchguard的一个洋人说要搞点东西出来,然后我可以参考完成patch module。
用Word2007写blog感觉不错,至少上传图片到wordpress不会像live writer一样出错。
祝大家新年好。












