这是我的困境。我有一个程序使用SendMessage
从聊天程序中获取文本。现在,当我在Visual Basic中完成此操作时,我只是将SendMessage
放在一个循环中,每当聊天被更新时,我的输出也会如此。C++ SendMessage循环停止和行结束
这不是C++
的情况。当我把SendMessage
放在一个循环中时,它会永远循环。说,聊天是一样的东西:
苹果
香蕉
麦片
现在让我们说我运行我的程序找到的文本,并开始循环。现在在Visual Basic中,它会一直循环,直到它碰到Cheerios
,它会停下来,等待聊天中的某人输入其他内容。
随着C++
它会输出:
苹果
香蕉
麦片
苹果
香蕉
麦片
...
而且永远持续下去。有没有办法阻止它?我一直在考虑EOF
的条款,但这并没有什么帮助,因为只要它到达最后一行,它就会退出循环,并且不会接收任何人在聊天中输入的内容。
以下是获取文本的部分代码。现在不是我有一个循环不会结束,直到我设置bLoop
到True
。
cout << " + found RichEdit20W window at: " << hwndRichEdit20W << endl << endl;
cout << "- get text " << endl;
bool bLoop = false;
int textLen = (int)SendMessage(hwndRichEdit20W, WM_GETTEXTLENGTH, 0, 0);
while (bLoop == false)
{
const int MAXSIZE = 32678;
wchar_t szBuf[MAXSIZE];
SendMessage(hwndRichEdit20W, WM_GETTEXT, (WPARAM)textLen, (LPARAM)szBuf);
wcout << szBuf;
}
感谢您的帮助!
VB代码更新
这是我做到了我的VB程序。这是为了一个游戏控制台而不是聊天窗口,但它应该是相同的概念吗?
注意Do While PARENThwnd <> IntPtr.Zero
句柄永远不会是0,所以它将是一个无限循环。
Private Sub bwConsole_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bwConsole.DoWork
Dim PARENThwnd As IntPtr
Dim CHILDhwnd As IntPtr
PARENThwnd = FindWindow(Nothing, "ET Console")
If PARENThwnd = IntPtr.Zero Then
txtConsole.Text = "ET Console is not availble."
Else
Do While PARENThwnd <> IntPtr.Zero
CHILDhwnd = GetDlgItem(PARENThwnd, 100)
Dim Handle As IntPtr = Marshal.AllocHGlobal(32767)
Dim NumText As Integer = CInt(SendMessage(CType(CHILDhwnd, IntPtr), WM_GETTEXT, CType(32767 \ Marshal.SystemDefaultCharSize, IntPtr), Handle))
Dim Text As String = Marshal.PtrToStringAuto(Handle)
txtConsole.Text = Text
Marshal.FreeHGlobal(Handle)
txtConsole.SelectionStart = txtConsole.TextLength
txtConsole.ScrollToCaret()
rtxtDefinition.Text = ""
Call GetDefinitions(txtConsole.Text)
Loop
End If
End Sub
也不能回答任何问题,直到今晚晚些时候。去上班。
请显示有效的VB代码。 –
你的VB代码显然必须有一些循环终止条件,它是什么? – paulm
增加了VB代码。这与我从C++代码中获得的部分是一样的;只是循环。除了关闭程序时,并没有终止。 – Unreliaable