1

我正在尝试创建一个 yahoo messenger 自动回复应用程序。如果我使用按钮来检索它,我可以检索新消息,但是如果我使用计时器来获取新消息,它会向我显示带有额外标记的新消息。这是错误。

错误

这是代码:

Private Sub Pause(ByVal seconds As Integer)
    Dim current As Date

    current = DateTime.Now
    Do While (DateTime.Now - current).TotalSeconds < seconds
        Application.DoEvents()
        Threading.Thread.Sleep(1000)
    Loop
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    Dim keyword As String = ""
    Dim arrKeyword() As String
    Dim param As String = ""

    ymVersion = getYMVersion()
    Select Case ymVersion
        Case "8"
        hwndYMMainClass = FindWindow("YSearchMenuWndClass", vbNullString)
        Case "9"
            hwndYMMainClass = FindWindow("ATL:007C07F0", vbNullString)
        Case "10"
            hwndYMMainClass = FindWindow("CConvWndBase", vbNullString)
    End Select

    If hwndYMMainClass <> 0 Then
        pause(1)
        ymid = getYMID(hwndYMMainClass)
        msg = getYMMessage(hwndYMMainClass)
        lstBox.Items.Add(ymid + "-" + msg)
        ymChatSend(hwndYMMainClass, "Telah terima")
        closeYM(hwndYMMainClass)
    End If
End Sub

顺便说一句,我使用了一个间隔为 500 的计时器。哪里是显示额外的错误 - 不是应该的?谢谢

4

2 回答 2

4

问题是你的 Pauses()。任何使用 DoEvents() 总是值得怀疑的,但在这里你是在计时器滴答事件期间这样做的,这尤其成问题——你很幸运没有看到 StackOverflow 异常。

这是发生了什么:当您调用 Pause() 时,程序进入一个循环以交替休眠和处理其他事件。如果还有其他事件要处理,就像直接在当前执行路径上调用该方法一样。由于您有一个定期将新事件放入消息队列的计时器,因此您的计时器滴答处理程序可以间接地以递归函数的形式结束并调用自身。如果您不小心,您会发现这比事件完成的速度更快:tick 处理程序运行,它调用 Pause(),Pause() 调用 DoEvents(),DoEvents() 再次调用 tick 处理程序,然后超过。关闭 Yahoo 的代码永远不会到达,并且您最终会添加到调用堆栈中,直到它已满(溢出)并且程序崩溃。

值得庆幸的是,这并没有发生在这里。这些症状表明您的 tick 方法确实会自行递归,但它只会重复一次。事件触发,它到达对 DoEvents() 的调用,该调用在同一执行路径中再次运行滴答事件。这次事件一直处理(Pause() 在引发另一个滴答事件之前完成)并完成它应该做的一切。现在原始事件可以完成处理,只是没有消息可以读取了。剩下的就是用“-”字符连接两个空字符串,这就是你的额外输出。

就个人而言,我会重写以避免使用 DoEvents(),但为了快速修复,请尝试在滴答事件的第一行禁用计时器并在滴答事件的最后一行重新启用它。

于 2012-07-19T16:22:09.000 回答
1

我意识到太晚了!;-) ,问题是由于 listbox.items.add() 由于“System.DoEvents()”而执行了两次

我建议您对代码进行以下更改,请告知他们是否解决了您的问题。

由此:

 ymid = getYMID(hwndYMMainClass)
 msg = getYMMessage(hwndYMMainClass)
 lstBox.Items.Add(ymid + "-" + msg)

对此:

 ymid = getYMID(hwndYMMainClass)
 msg = getYMMessage(hwndYMMainClass)
 lstBox.Items.Add(cstr(ymid) & "-" & cstr(msg))

如果这不能解决您的问题,我很确定作为消息出现的任何内容末尾都有一个尾随“-”,如果您获得的每个列表条目都以额外的“-”行结束,那么请尝试使用如果确实找到“-”,则删除最后一个字符。

从 msg 中删除尾随的“-”:

Dim holdMsg as String = vbnullstring 'I'm not sure if msg is of type String...

     ymid = getYMID(hwndYMMainClass)
     msg = getYMMessage(hwndYMMainClass)
     holdMsg = cstr(msg)

        If holdMsg.Last = "-" Then
            'Remove that char from the string
            holdMsg = holdMsg.Substring(0, holdMsg.Length - 1)
            lstBox.Items.Add(cstr(ymid) & "-" & holdMsg)
        End If
于 2012-07-19T15:55:51.597 回答