网上本来有的是C#的版本,我花了老半天,把他转成Vb.net2005的版本,并且翻译了程序中的注解,现在提供给朋友们:
使用的是荷兰强人的DotMsn组件(.net1.1版本的),C#,版源代码点击这里下载 .现在有2.0版本的,可以点击这里去看看.
我的VB.net版本 源代码点击这里下载
需要先应用dotmsn.dll组件,在源文件的debug下面
界面
代码:
Imports DotMSN
Public Class Form1
Private messenger As DotMSN.Messenger = New Messenger()
Private Sub StartButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StartButton.Click
StartMSN()
End Sub
Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Control.CheckForIllegalCrossThreadCalls = False
End Sub
'启动MSN程序
Private Sub StartMSN()
Dim currentDomain As AppDomain = AppDomain.CurrentDomain
'AddHandler currentDomain.UnhandledException, AddressOf MyHandler
messenger = New Messenger()
Try
'确认输入的PASSPORT帐号不是默认的设置,否则报错误!
If mailTextBox.Text = "yourmail@hotmail.com" Then
MessageBox.Show(Me, "键入你的Msn账号,以登录MSN服务器")
Else
'事件重载代码段
'重载上线函数
AddHandler messenger.ContactOnline, AddressOf ContactOnline
'重载会话创建函数
AddHandler messenger.ConversationCreated, AddressOf ConversationCreated
'重载同步处理函数
AddHandler messenger.SynchronizationCompleted, AddressOf OnSynchronizationCompleted
'所有事情都被启动了,现在链接到messenger服务器
messenger.Connect(mailTextBox.Text, passTextBox.Text)
Log.Text += "已连接!" + vbCrLf
messenger.SynchronizeList() '与服务器同步联系人列表
messenger.Owner.Name = "九品仙"
End If
Catch e As MSNException
' 错误处理
MessageBox.Show(Me, "连接失败: " + e.ToString())
End Try
End Sub
'其中messenger的Connect方法是登录MSN服务器的主要方法,在登录之前我们需要对于MSN的一些消息事件做重载处理,以便将来这些事件触发时可以调用我们自己编写的逻辑处理代码。
'在登录到MSN服务器成功后,马上需要调用的方法就是SynchronizeList(),即与服务器同步联系人列表,列表分为以下4种:
'l ForwardList:所有有效联系人列表,可以互相发送消息。
'l ReverseList:所有你在对方联系人列表中的联系人列表。
'l BlockedList:所有你阻止的联系人列表。
'l AllowedList:所有能够看到你状态的联系人列表。
'通过对于上述4种列表的操作,可以让机器人了解所有联系人的相关状态并实施相应的操作。
'在同步联系人列表结束后,需要设置messenger的状态,MSNStatus是状态的枚举量,使用SetStatus方法来进行设置,状态包括:在线、离线、离开、马上回来、外出就餐等,通过对状态变量的设置可以让联系人看到机器人的不同在线情况。同时通过messenger.Owner.Name的设置可以让机器人在联系人端显示你需要的名称。
'接下来比较主要的工作就是对于MSN各类事件的重载处理了,我这里举两个事件处理的例子,其他的事件可以从dotMSN的帮助文件中查阅。机器人的各类逻辑就是通过对于这些事件的重载来实现的。
'会话创建时间处理程序
Private Sub ConversationCreated(ByVal sender As Messenger, ByVal e As ConversationEventArgs)
'记录会话创建日志
Log.Text += "会话对象创建:" + vbCrLf
'当联系人加入对话时处理函数
AddHandler e.Conversation.ContactJoin, AddressOf ContactJoined
'连接建立时处理函数
AddHandler e.Conversation.ConnectionEstablished, AddressOf ConnectionEstablished
'当其它联系人键入什么的时候提醒我
AddHandler e.Conversation.UserTyping, AddressOf ContactTyping
'接收文件传输时处理函数
AddHandler e.Conversation.FileTransferHandler.InvitationReceived, AddressOf FileTransferHandler_FileTransferInvitation
End Sub
'连接建立处理函数
Private Sub ConnectionEstablished(ByVal sender As Conversation, ByVal e As EventArgs)
Log.Text += "连接确定." + vbCrLf
End Sub
'联系人输入消息时处理函数
Private Sub ContactTyping(ByVal sender As Conversation, ByVal e As ContactEventArgs)
MessageBox.Show(Me, e.Contact.Name + "正在输入...")
End Sub
' 当一个连接在线的时候引发一个日志事件
Private Sub ContactOnline(ByVal sender As Messenger, ByVal e As ContactEventArgs)
Log.Text += e.Contact.Name + " 在线" + vbCrLf
End Sub
'联系人加入对话处理函数
Private Sub ContactJoined(ByVal sender As Conversation, ByVal e As ContactEventArgs)
'联系人加入对话,记录联系人姓名到日志中
Log.Text += e.Contact.Name + "加入会话" + vbCrLf
'输入欢迎词
sender.SendMessage("你好啊!我是" + messenger.Owner.Name)
End Sub
'当双击在线列表中的人的时候给他发送一个信息
Private Sub contactListView_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles contactListView.DoubleClick
'listview项目的'tag'属性是用来存储dotMsn库的联系人对象的.
Dim contact As Contact = DirectCast(contactListView.SelectedItems(0).Tag, DotMSN.Contact)
' 做一个会话请求你可以随意的定义一个客户端数据,
' 例如你有自己的会话对象因此请求在事件之后被确认
messenger.RequestConversation(contact.Mail)
End Sub
'文件接收动作处理函数
Private Sub FileTransferHandler_FileTransferInvitation(ByVal sender As FileTransferHandler, ByVal e As FileTransferInvitationEventArgs)
'接收动作为真
e.Accept = True
' 把接收的文件存储到C盘
'e.FileTransfer.ReceiveStream = new FileStream("C://" + e.FileTransfer.FileName, FileMode.Create, FileAccess.ReadWrite);
Log.Text += "请求传送文件 " + e.FileTransfer.FileName + vbCrLf
End Sub
'用户按这个键显示所有的在线的列表
Private Sub showlistButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles showlistButton.Click
FillListview()
End Sub
Private Sub FillListview()
'把在线的联系人填入到listview中去,通过双击一个listview项目一个通讯的联系人被创建
contactListView.Clear()
For Each contact As Contact In messenger.GetListEnumerator(MSNList.ForwardList)
'显示在线的联系人()
If contact.Status <> MSNStatus.Offline Then
' 把连接加入 listview,
' 在listitem中'tag'属性保存联系人的对象
Dim item As New ListViewItem(contact.Name)
item.Tag = contact
contactListView.Items.Add(item)
End If
Next
End Sub
'同步完成的时候调用,当这个发生的时候我们把他填入到窗体的listbox中去.
Private Sub OnSynchronizationCompleted(ByVal sender As Messenger, ByVal e As EventArgs)
'首先显示所有联系人的列表,在一个普通用户登陆的时候,这是主要的列表
'如果你想去得到所有在线人员的列表,那么你列举这个列表用DotMSN.MSNStatus状态去比对online/away/busy等状态.
For Each contact As Contact In messenger.GetListEnumerator(MSNList.ForwardList)
Me.Log.Text += "FL > " + contact.Name + " (" + CStr(contact.Status) + ")" + vbCrLf
FillListview()
Next
'所有你在对方联系人列表中的联系人列表。
For Each contact As Contact In messenger.ReverseList
Me.Log.Text += "RL > " + contact.Name + " (" + CStr(contact.Status) + ")" + vbCrLf
Next
' 所有你阻止的联系人列表。
For Each contact As Contact In messenger.BlockedList
Me.Log.Text += "BL > " + contact.Name + " (" + CStr(contact.Status) + ")" + vbCrLf
Next
'所有能够看到你状态的联系人列表。
For Each contact As Contact In messenger.AllowedList
Me.Log.Text += "AL > " + contact.Name + " (" + CStr(contact.Status) + ")" + vbCrLf
Next
' 现在设置我的最初状态
messenger.SetStatus(MSNStatus.Online)
Log.Text += "我的状态是在线" + vbCrLf
End Sub
End Class
剩下的问题:我在vista下,这个程序登陆后退出会跳出一个错误,不知道怎么解决啊,有知道怎么解决的告诉我啊.
欢迎光临我的网站 www.vbxna.com