2010-09-03 116 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读取缓冲区。加上清理。