0

我正在使用我想监视事件的 readprocessmemory 从应用程序中读取 CHAT。

    Attach() 'attach to process
    Dim chatStart As Integer = &H6E3220

    Dim lines As Integer = 150 'chatlines
    Dim offset As Integer = 98 'offset between chat lines
    Dim arrAddressList(0 To lines) As IntPtr
    Dim addressToAdd As IntPtr = chatStart 'first line
    arrAddressList(0) = addressToAdd 'assign firstline

    For i = 1 To lines 'loop the other 149 lines and assign the address
        chatStart += offset 'skip to the address of the next line
        arrAddressList(i) = chatStart  'assign the new address to its place in the array
    Next
    For j = 0 To arrAddressList.Count - 1
        Dim chatText As String = MEMMGR.ReadAsciiString(arrAddressList(j), 104)
        If chatText = "" Then 'chat lines not filled, exit
            Exit For
        Else
            AddLog(chatText) 'puts into text box
        End If
    Next

如果应用程序刚刚启动,并且所有行都没有填满,则无需循环所有 150 行。

聊天框最多 150 行,当达到 150 时,所有聊天都被推上去,所以第 150 行现在是最新的聊天文本行。

我当前的代码将读取聊天框中的所有聊天内容。

我能想到的检测更改的唯一方法是将其全部读取两次,然后比较结果并循环,直到它在数组中找到不同的行 - 这些将是“更新”的行。根据聊天的活跃程度,可能会更新不止一行,因此需要另一个数组包含上次聊天检索后的所有行更改。

但是,当我开始做这件事时,我不知道从哪里开始,因为这似乎很令人困惑,在这件事上有更多逻辑的人能否指出我正确的方向,或者解释最好(最快)的方法来做到这一点?

非常感谢您花时间阅读本文,我希望它不会太混乱。

4

1 回答 1

0

如果您的聊天线路是唯一的,您可以使用 LINQ:

Dim chat1() As String = {"abc", "bcd", "cde"}
Dim chat2() As String = {"abc", "bcd", "cde", "def"}

Dim diff() As String = chat2.Except(chat1).ToArray

理想情况下,您不需要阅读所有行,只需从下到上。

找到您的字典中已有的记录时停止。

于 2013-05-12T15:27:29.837 回答