2010-09-03 52 views
0

我遇到EM_GETLINE的小問題。 我有一個文本框我想從中提取文本。該盒子一直保持更新(這是一個日誌文件,它始終在更新,最後一個消息在底部)。 我想要的只是最後一行。EM_GETLINE錯誤C++從文本框中獲取最後一行

我的代碼:

 HWND hwnd = (HWND)0x00020A72; 
TCHAR param[1000]; 
char display[1000]; 
LONG lResult; 
lResult = SendMessage(hwnd, WM_GETTEXT, 500, (LPARAM)param); 
//lResult = SendMessage(hwnd, EM_STREAMOUT, SF_RTF, (LPARAM)param); 
//lResult = SendMessage(hwnd, EM_GETLINE, 1, (LPARAM)param); 
wcstombs(display, param, 1000); 

printf(" %s\n", display); 

正如你可以看到我已經試過WM_GETTEXT(的作品)。當使用GETLINE它編譯好(VS2010express)但返回垃圾。

會非常感激的幫助。 謝謝傾聽。

+1

閱讀該文檔: 「在發送消息之前,請將此緩衝區的第一個字設置爲TCHAR中緩衝區的大小。」 – anno 2010-09-03 10:33:44

+0

我看到了,但我對這個東西很陌生,我不確定他們的意思。聽起來像一個謎語... – Rocky 2010-09-03 13:26:07

+0

看到這個主題:http://www.gamedev.net/community/forums/topic.asp?topic_id=147943 – anno 2010-09-03 19:19:33

回答

1

你應該問最後不是第一行,並添加NULL爲終止,請嘗試以下操作:

int last_line = SendMessage(hwnd, EM_GETLINECOUNT,0 ,0) - 1; 
int size = SendMessage(hwnd, EM_GETLINE, (WPARAM)last_line, (LPARAM)param); 
param[size] = 0;//EM_GETLINE does not add the NULL 
+0

嗯,我試過你的消化,但我收到0作爲大小。另一方面計數的行是工作,是正確的... ;-( 任何想法爲什麼大小爲0? 謝謝 – Rocky 2010-09-03 13:27:50

+0

@Rocky文檔說,返回值爲零時,行是錯誤的,我想這可能是那麼hwnd屬於另一個進程 – Tassos 2010-09-05 10:05:00

+1

這不是問題,這裏的問題是你無法初始化緩衝區來保存第一個字的緩衝區大小:'((WORD *)param)[0] = bufferSize; '在發送'EM_GETLINE'之前。 – IInspectable 2013-12-04 20:49:13

2

該窗口屬於另一個進程,對不對?我可以看到你硬編碼窗口句柄。不太確定消息是否跨進程邊界自動封送,只有系統消息是(WM_Xxx < 0x400)。

自己封裝需要OpenProcess,VirtualAllocEx分配緩衝區,WriteProcessMemory初始化它,SendMessage,ReadProcessMemory讀取緩衝區。加上清理。