gpt4 book ai didi

C++ SendMessage循环停止和行尾

转载 作者:行者123 更新时间:2023-11-30 04:09:49 25 4
gpt4 key购买 nike

这是我的困境。我有一个使用 SendMessage 的程序从聊天程序中获取文本。现在,当我在 Visual Basic 中执行此操作时,我只是将 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

也将在今晚晚些时候之前无法回答任何问题。去上类了。

最佳答案

您永远不会更新您的 bLoop 变量,导致循环无限运行。如果您想中断循环,请实现一个循环终止条件,该条件会更改 bLoop 的值。

代码的精简版执行以下操作:

bool bLoop = false;
while ( bLoop == false ) {
// This loop never terminates, unless bLoop is set to true
}

有点难以理解,为什么要开始循环。我想您希望 SendMessage 调用会以某种方式猜测您不希望它运行,直到满足某些条件。函数中没有这种魔法。

要响应文本更改,您应该选择完全不同的解决方案:基于事件的模型。支持的实现方式是通过 UI Automation .

关于C++ SendMessage循环停止和行尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20935516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com