這是我的困境。我有一個程序使用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