我以这种方式使用 ListView_GetItemText
:
int count = ListView_GetItemCount(procmon_lv); //Get Items count
wchar_t buffer[2048]; //Init buffer
ListView_GetItemText(procmon_lv, count-1, 0, buffer, 2048); //Call function
LPWSTR itemtxt = buffer; //Create LPWSTR var
stringstream s;
s << itemtxt;
MessageBoxA(NULL, s.str().c_str(), NULL, NULL);
Sleep(7000); //Sleep because this piece of code is inside a While loop
MessageBox 函数显示如下:
我需要的是获取该行的整个文本,但似乎我得到的是一个十六进制字符串...
最佳答案
std::stringstream
将 wchar_t*
指针视为通用指针,因此存储指针的值,而不是它指向的字符。
如果要使用MessageBoxA
,需要将wchar_t
数据转换为ANSI。
int count = ListView_GetItemCount(procmon_lv); //Get Items count
wchar_t buffer[2048] = {0}; //Init buffer
char buffer_ansi[2048 * 2] = {0};
ListView_GetItemText(procmon_lv, count-1, 0, buffer, 2048); //Call function
WideCharToMultiByte(CP_ACP, 0, buffer, -1, buffer_ansi, sizeof(buffer_ansi), NULL, NULL);
stringstream s;
s << buffer_ansi;
MessageBoxA(NULL, s.str().c_str(), NULL, 0);
更新:您不应该为 MessageBoxA
的第四个参数使用 NULL
,它不是指针。
更新 2:不是将字符串转换为 ANSI,而是使用 std::wstringstream
而不是 std::stringstream
,并调用 MessageBoxW()
而不是 MessageBoxA()
。
int count = ListView_GetItemCount(procmon_lv); //Get Items count
wchar_t buffer[2048] = {0}; //Init buffer
ListView_GetItemText(procmon_lv, count-1, 0, buffer, 2048); //Call function
std::wstringstream s;
s << buffer;
MessageBoxW(NULL, s.str().c_str(), NULL, 0);
注意:您有注释“Init buffer”,所以初始化缓冲区。
更新 3:或者,根本不使用 std::wstringstream
。
int count = ListView_GetItemCount(procmon_lv); //Get Items count
wchar_t buffer[2048] = {0}; //Init buffer
ListView_GetItemText(procmon_lv, count-1, 0, buffer, 2048); //Call function
MessageBoxW(NULL, buffer, NULL, 0);
关于c++ - Winapi ListView_GetItemText 错误的输出格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33610997/