当前位置:有风信息港IT学院编程技术.net → 在Vs.net中使用MSN即时通讯软件

在Vs.net中使用MSN即时通讯软件

减小字体 增大字体 作者:有风IT学院  来源:有风信息港  发布时间:2008-1-13 8:45:02
选择自 adonis2222 的 Blog

把MSN嵌入到Vs.net中使用?是不是听起来很奇妙?但这是真的,下面的步骤就逐步的教你如何将MSN嵌入到Vs.net中使用。

引用(referrence)

由于Vs.net中存在某个bug,在这里无法直接引用Messenger ActiveX组件。你需要手动修改由TLBImp生成的代码中的两个方法,然后重新编译,具体方法如下:

1 使用Tlbimp.exe生成一个Messenger Interop组件

tlbimp msmgs.exe /out:Messenger.dll (缺省路径:C:\Program Files\Messenger)


2 反汇编此Interop组件,然后将其保存为IL文件:

ildasm /text Messenger.dll /out:Messenger.il


3 使用任一文本编辑器打开此IL文件,然后更改如下代码 (将类的private属性改为public):

更改.class private auto ansi sealed DMsgrObjectEvents_SinkHelper
为 .class public auto ansi sealed DMsgrObjectEvents_SinkHelper



更改.class private auto ansi sealed DMsgrObjectEvents_EventProvider

为 .class public auto ansi sealed DMsgrObjectEvents_EventProvider



4 编译此IL文件

ilasm /dll Messenger.il



5 现在我们就可以在工程里引用编译后的dll文件了

创建外接程序 (creating an add-in)

选择 新建项目\其他项目\扩展性项目\Visual Studio .NET 外接程序,出现向导对话框。

1 选择“使用Visual C#创建外接程序

2 选择使用此外接程序的开发环境,我两个都选择了。

3 给你的外接程序起个好听的名字。

4 根据你的爱好进行选择。

5 是否生成“帮助”菜单中的“关于”信息。

6 选择“完成”

创建工具窗口

我们需要把这个外接程序做成一个工具窗口。如何来做呢?我们可以使用微软提供的一个在.NET中制作工具窗口的例子。

1 引用由VSUserControlHost 生成的ActiveX控件。

2 在此外接程序中的Connect.cs文件中的OnConnection方法中添加以下代码

1. object objTemp = null;
2. string guidstr = "{716238D9-8ED3-48aa-A7A0-A73CA6FDF1EF}";
3.
4. EnvDTE.Window windowToolWindow =
5. applicationObject.Windows.CreateToolWindow (
6. addInInstance,
7. "VSUserControlHost.VSUserControlHostCtl",
8. "Messenger", guidstr, ref objTemp);
9.
10. windowToolWindow.Visible = true;
11.
12. VSUserControlHostLib.IVSUserControlHostCtl objControl =
13. (VSUserControlHostLib.IVSUserControlHostCtl)objTemp;
14.
15. objControl.HostUserControl(
16. System.Reflection.Assembly.GetExecutingAssembly().Location,"MsgAddin.HostUserControl");
MSN编程

现在我们就进入到了对MSN本身的编程了。在“项目”中选择“添加用户控件”。用户控件的处理方式和windows 窗体的处理方式是一样的。然后在此“用户控件”上添加一个”发送”按钮,“编辑”框及一个ListView。我们需要用到用户控件类中的两个成员:



初始化

Messenger.MsgrObjectClass msg;
Messenger.IMsgrUser CurrentUser;
Messenger.IMsgrUsers Users;


在构造函数中添加如下代码

msg = new Messenger.MsgrObjectClass();

try
{
// 检查MSN是否已经登录
if(msg.LocalState == Messenger.MSTATE.MSTATE_OFFLINE)
{
Messenger.MessengerAppClass app =
new Messenger.MessengerAppClass();

app.IMessengerApp_LaunchLogonUI();

// 等待登录完成
while(msg.LocalState != Messenger.MSTATE.MSTATE_ONLINE)
System.Threading.Thread.Sleep(5000);
}

// 获取用户列表
Users = msg.get_List(Messenger.MLIST.MLIST_CONTACT);

for(int i = 0; i < Users.Count; i++)
{
Messenger.IMsgrUser u = Users.Item(i);
userList.Items.Add(new ListViewItem(u.FriendlyName, GetStateImage(u.State)));
}

// 获取新信息通知
msg.OnTextReceived +=
new Messenger.DMsgrObjectEvents_OnTextReceivedEventHandler
(this.OnTextRecieved);

// 获取用户状态改变通知
msg.OnUserStateChanged += new
Messenger.DMsgrObjectEvents_OnUserStateChangedEventHandler
(this.OnUserStateChanged);

}
// 异常处理
catch(Exception e)
{
MessageBox.Show(e.Message);
}


接收消息

判断有新消息的方法就是接收的内容是否为“text”类型,代码如下

private void OnTextRecieved(Messenger.IMsgrIMSession s,
Messenger.IMsgrUser u, string header, string text,
ref bool default)
{
if(header.IndexOf("Content-Type: text/plain") != -1 &&
u.FriendlyName != "Hotmail")
{
messageWindow.AppendText(u.FriendlyName + ": " + text + "\r\n");
CurrentUser = u;
default = false;
}
}


发送消息

将你要发送的消息输入到“编辑”框,然后点“发送”按钮,“编辑”框中的内容将由如下代码发送出去:

private static string header =
"MIME-Version: 1.0\r\nContent-Type: text/plain;" +
"charset=UTF-8\r\nX-MMS-IM-Format: " +
"FN=MS%20Shell%20Dlg; EF=; CO=0; CS=0; PF=0\r\n\r\n";

private void send_Click(object sender, System.EventArgs e)
{
CurrentUser.SendText(header, this.sendText.Text,
Messenger.MMSGTYPE.MMSGTYPE_ALL_RESULTS);

messageWindow.AppendText("You say: " + sendText.Text + "\r\n");
}


更新联系人的状态

我在ListView中使用了不同的图标来表示联系人相应的状态。当调用构造函数的时候,联系人的状态被第一次设置。当联系人状态改变的时候则调用OnUserStatusChanged() 事件,更新联系人的状态。

private void OnUserStateChanged(Messenger.IMsgrUser user,
Messenger.MSTATE state, ref bool default)
{
for(int i = 0; i < Users.Count; i++)
{
if(user == Users.Item(i))
{
ListViewItem item = userList.Items[i];
item.ImageIndex = GetStateImage(user.State);
}
}
}


小结

我希望大家会对这篇文章感兴趣,通过这篇文章我们也了解了MSN的一小部分功能。MSN还有很多其他的功能等我们去挖掘。Ok,现在我们知道了创建Vs.net外接程序其实是一件很容易的事情,你可以由此创建出更多富有创造性的外接程序