Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
EM#u GETLINE错误C++;从文本框中获取最后一行_C_Winapi_Em Getline - Fatal编程技术网

EM#u GETLINE错误C++;从文本框中获取最后一行

EM#u GETLINE错误C++;从文本框中获取最后一行,c,winapi,em-getline,C,Winapi,Em Getline,我和EM_GETLINE有点小问题。 我有一个文本框,我想从中提取文本。该框一直在更新(它是一个不断更新的日志文件,最后一条消息位于底部)。 我只想要最后一行 我的代码: HWND hwnd = (HWND)0x00020A72; TCHAR param[1000]; char display[1000]; LONG lResult; lResult = SendMessage( hwnd, WM_GETTEXT, 500, (LPARAM)param); //lRes

我和EM_GETLINE有点小问题。 我有一个文本框,我想从中提取文本。该框一直在更新(它是一个不断更新的日志文件,最后一条消息位于底部)。 我只想要最后一行

我的代码:

        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时,它编译nice(VS2010express),但返回垃圾

我会非常感激你的帮助。
谢谢收听。

您应该询问最后一行而不是第一行,并为终止添加空值,请尝试以下操作:

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

您应该请求最后一行而不是第一行,并为终止添加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

这个窗口属于另一个进程,对吗?我能看到你把车窗把手硬编码了。不确定消息是否自动跨进程边界封送,只有系统消息是(WM_Xxx<0x400)


自行封送需要OpenProcess、VirtualAllocEx来分配缓冲区、WriteProcessMemory来初始化缓冲区、SendMessage、ReadProcessMemory来读取缓冲区。加上清理。

此窗口属于另一个进程,对吗?我能看到你把车窗把手硬编码了。不确定消息是否自动跨进程边界封送,只有系统消息是(WM_Xxx<0x400)

自行封送需要OpenProcess、VirtualAllocEx来分配缓冲区、WriteProcessMemory来初始化缓冲区、SendMessage、ReadProcessMemory来读取缓冲区。加上清除。

“指向接收行副本的缓冲区的长指针。缓冲区的第一个字指定可以复制到缓冲区的最大字符数”

“指向接收行副本的缓冲区的长指针。缓冲区的第一个字指定可以复制到缓冲区的最大字符数”


阅读文档:“在发送信息之前,请将缓冲区的第一个字设置为缓冲区的大小(以TCHARs为单位)。”我看到了这一点,但我对这一点非常陌生,我不是舒尔,也不是舒尔。对我来说,这听起来像个谜……看这条线索:阅读文档:“在发送消息之前,请将缓冲区的第一个字设置为缓冲区的大小(以TCHARs为单位)。”我看到了这一点,但我对这些东西很陌生,我不是舒尔。对我来说,听起来像个谜……看这条线索:我试过你的建议,但我得到的尺寸是0。另一方面,测线计数有效且正确-(知道为什么大小是0吗?Thanks@Rocky文档中说,当行出错时,返回值为零。我想可能是hwnd属于其他进程。这不是问题所在。这里的问题是,您无法初始化缓冲区以将缓冲区大小保留在其第一个字中:
((word*)param)[0]=bufferSize;
发送前
EM_GETLINE
。我尝试了你的建议,但我收到的大小是0。另一方面,行计数是有效的,并且是正确的-(知道为什么大小是0吗?Thanks@Rocky文档中说,当行出错时,返回值为零。我想可能是hwnd属于其他进程。这不是问题所在。这里的问题是,您无法初始化缓冲区以将缓冲区大小保留在其第一个字中:
((word*)param)[0]=bufferSize;
发送前
EM\u GETLINE