分享

[转载]使用 MessengerAPI 控制 MSN Messenger

 长江黄鹤 2013-08-18
不知道微软是否基于安全原因考虑,其提供的 MessengerAPI 和 IMessengerAddIn 功能上都大打折扣。本文讲述如何调用 MessengerAPI。

引入 MessengerAPI

在项目中添加 COM 引用 "Messenger API Type Library",注意该 COM 的文件路径应该是 "c:\program file\MSN Messenger\msnmsgr.exe"。如果不是可以使用下面的命令注册该 COM。
C:\WINDOWS\system32\URTTemp>regtlib.exe "c:\program files\msn messenger\msnmsgr.exe\2"
然后添加名字空间,创建 Messenger 对象。
using MessengerAPI;
// ...
MessengerClass msn = new MessengerClass();
1. 登录
// 登录 (我用 Windows Live Messenger 8 不起作用。晕~~~)
//msn.Signin(0, "abc@hotmail.com", "pasword");

// 自动登录 (使用你保存的用户名和密码自动登录)
//msn.AutoSignin();

// 注销
//msn.Signout();
2. 主窗体

可显示、关闭主窗体,获取或设置主窗体位置、大小。IMessengerWindow mainForm = msn.Window as IMessengerWindow;
mainForm.Show();
//mainForm.Close();
//mainForm.Left = 1;
//mainForm.Top = 1;
//mainForm.Height = 100;
//mainForm.Width = 100;
3. 个人信息及状态

本地用户名称、登录名为只读,没有接口设置个人状态信息。
msn.MyStatus = MISTATUS.MISTATUS_BUSY; // 设置状态
Console.WriteLine(msn.MyFriendlyName); // 名称
Console.WriteLine(msn.MySigninName); // 登录名(邮件地址)
4. 联系人组

创建组msn.CreateGroup("我的同事", ((IMessengerServices)msn.Services).PrimaryService);
联系人组IMessengerGroups groups = msn.MyGroups as IMessengerGroups;
foreach (IMessengerGroup group in groups)
{
   Console.WriteLine(group.Name);

   // 删除组
   if (group.Name == "我的同事") groups.Remove(group);

   // 显示该组下所有联系人
   foreach (IMessengerContact c in (IMessengerContacts)group.Contacts)
     Console.WriteLine("\t{0}", c.SigninName);
}
5. 联系人

添加联系人。下面的代码将打开添加联系人对话框,可以使用默认联系人地址,也可以为null。msn.AddContact(0, "abc@hotmail.com");
联系人列表IMessengerContacts contacts = msn.MyContacts as IMessengerContacts;
foreach (IMessengerContact contact in contacts)
{
   Console.WriteLine("{0};{1};{2};{3}", contact.FriendlyName, contact.SigninName, contact.Status, contact.Blocked);

   // 删除联系人
   if (contact.SigninName == "abc@hotmail.com") contacts.Remove(contact);
}
获取联系人对象 (在很多操作中需要使用联系人对象作为参数)IMessengerContact contact = msn.GetContact("abc@hotmail.com", msn.MyServiceId) as IMessengerContact;
6. 发送消息

MessengerAPI 取消了一些功能,其中就包括发送消息和消息事件。我们可以使用 System.Windows.Forms.SendKeys 向聊天窗口发送按键来完成消息发送。
IMessengerContact contact = msn.GetContact("abc@hotmail.com", msn.MyServiceId) as IMessengerContact;

if (contact != null)
{
   // 打开聊天窗口
   IMessengerConversationWnd dialog = msn.InstantMessage(contact) as IMessengerConversationWnd;

   dialog.Show(); // 确保聊天窗口为当前活动窗口。
   //Thread.Sleep(1000); // 在 ConsoleApplication 中适当延迟,否则 SendKeys 好像时灵时不灵。

   string s = "Hello, World! " + DateTime.Now.ToString();
   SendKeys.SendWait(s); // 发送消息按键。
   SendKeys.SendWait("{ENTER}"); // 回车发送。

   // 邀请其他人加入
   //dialog.AddContact(msn.GetContact("xxx@hotmail.com", msn.MyServiceId));

   // 查看当前聊天联系人列表
   //foreach (IMessengerContact c in (IMessengerContacts)dialog.Contacts)
   //{
   //   Console.WriteLine(c.SigninName);
   //}
  
   // 关闭聊天窗口  
   //dialog.Close();
}
7. 其他
// 打开音视频设置窗口
//msn.MediaWizard(0);

// 打开当前登录关联的 Hotmail 邮箱。
//msn.OpenInbox();

// 打开选项窗口
//msn.OptionsPages(0, MOPTIONPAGE.MOPT_ACCOUNTS_PAGE);

// 获取文件保存目录
//Console.WriteLine(msn.ReceiveFileDirectory);

// 打开 Hotmail 网页,给指定联系人写邮件。
//msn.SendMail(contact);

// 开启视频通讯
//msn.StartVideo(contact);

// 开启音频通讯
//msn.StartVoice(contact);

// 查看联系人档案文件
//msn.ViewProfile(contact);
8. 事件

事件使用比较简单,看名称就知道干什么用的。
public event OnAppShutdown;
public event OnContactAddedToGroup;
public event OnContactBlockChange;
public event OnContactFriendlyNameChange;
public event OnContactListAdd;
public event OnContactListRemove;
public event OnContactPagerChange;
public event OnContactPhoneChange;
public event OnContactPropertyChange;
public event OnContactRemovedFromGroup;
public event OnContactStatusChange;
public event OnEmoticonListChange;
public event OnGroupAdded;
public event OnGroupNameChanged;
public event OnGroupRemoved;
public event OnIMWindowContactAdded;
public event OnIMWindowContactRemoved;
public event OnIMWindowCreated;
public event OnIMWindowDestroyed;
public event OnMyFriendlyNameChange;

// 本地用户更改显示图片时触发。
public event OnMyPhoneChange;

public event OnMyPropertyChange;

// 本地用户改变状态时触发(包括与服务连接等系统状态)。
public event OnMyStatusChange;

// 本地用户登录时触发。
public event OnSignin;

// 本地用户注销时触发。
public event OnSignout;

// 关联邮箱接收到新的未读邮件时触发。
public event OnUnreadEmailChange;
----------

使用以上这些功能只能做些依赖客户端的小玩意,如果要开发一个类似 XiaoI 那样的群恐怕要使用 DotMSN 才行。另外,还可以考虑使用 APIHook 进行一些更高级的功能开发。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多