VB.net 调用DotMsn实现和Msn通讯

网上本来有的是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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值