//----------------------------------------------------------------------------------
// 将 宽字节wchar_t* 转换 单字节char*
inline char* UnicodeToAnsi( const wchar_t* szStr )
{
int nLen = WideCharToMultiByte( CP_ACP, 0, szStr, -1, NULL, 0, NULL, NULL );
if (nLen == 0)
{
return NULL;
}
char* pResult = new char[nLen];
WideCharToMultiByte( CP_ACP, 0, szStr, -1, pResult, nLen, NULL, NULL );
return pResult;
}
void MyGetListViewItem(HWND hwndLV)
//void GetListViewInfo(HWND h)
//VC2010测试通过
//自己修改为C#的吧
{
if(hwndLV==NULL)
{
return;
}
//目标进程ID与句柄
DWORD PID;
HANDLE hProcess;
int nBufferLength=50; //缓冲区大小
int nRowCount=0; //行数
nRowCount =(int)::SendMessage(hwndLV,LVM_GETITEMCOUNT,0,0); //获取ListView行数
if(nRowCount<=0)
return;
int nColCount=0; //列数
HWND hHeader = (HWND)::SendMessage(hwndLV,LVM_GETHEADER, 0,0);
nColCount =(int)::SendMessage(hHeader,HDM_GETITEMCOUNT,0,0); //获取ListView列数
if(nColCount<=0)
return;
//远程虚拟空间地址
LVITEM *pVirtualItem;
wchar_t *pVirtualBuffer;
GetWindowThreadProcessId(hwndLV,&PID);
hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID); //获取目标进程句柄失败
if(!hProcess)
return;
//在目标进程地址空间分配内存
pVirtualItem =(LVITEM *)VirtualAllocEx(hProcess, NULL, sizeof(LVITEM) , MEM_COMMIT, PAGE_READWRITE);
pVirtualBuffer=(wchar_t *)VirtualAllocEx(hProcess, NULL, nBufferLength*2, MEM_COMMIT, PAGE_READWRITE);
if ((!pVirtualItem)||(!pVirtualBuffer))
{
return;
}
for(int i=0;i<nRowCount;i++)
{
String^ strInfo = "";
for(int j=0;j<nColCount;j++)
{
wchar_t *buffer =new wchar_t[nBufferLength];
wmemset(buffer,0,nBufferLength);
LVITEM lvitem;
lvitem.cchTextMax=nBufferLength*2;
lvitem.iSubItem=j;
lvitem.pszText=pVirtualBuffer;
//核心技术:将LVITEM结构体插入目标进程里,然后通过LVM_GETITEMTEXT消息获取指定项的文本
WriteProcessMemory(hProcess, pVirtualItem, &lvitem, sizeof(LVITEM), NULL);
::SendMessage(hwndLV, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)pVirtualItem);
ReadProcessMemory(hProcess, pVirtualBuffer, buffer, nBufferLength*2,NULL);
//Char* UnicodeToAnsi()
char* ctemp=UnicodeToAnsi(buffer);
String^ stemp=""; //gcnew String(buffer);
stemp=System::Runtime::InteropServices::Marshal::PtrToStringUni((IntPtr)ctemp);
delete []buffer;
}
//MessageBox(strInfo); //---------输出一行
}
//释放目标进程里分配的内存
VirtualFreeEx(hProcess,pVirtualItem ,sizeof(LVITEM) ,MEM_RELEASE);
VirtualFreeEx(hProcess,pVirtualBuffer,nBufferLength*2,MEM_RELEASE);
CloseHandle(hProcess);
}
在这之前已经忙了三天,试过n中方法了,结束是要么导致进程崩溃,要么取不到数据,这段代码可以取到文字,但是是乱码,无论我怎么转换,始终都无法正确显示中文,网络上有很多类似的例子实际上是只能在VC6下运行的。本人初学者实在没办法了上来求助,这个版本的作者说在VC2010下通过,可我运行却是乱码。顺便说一下,我的程序不是MFC,我把Cstring替换成了System::String
此段代码来自:
http://bbs.csdn.net/topics/350200042 作者 @ZengHD
另外,@jackyjkchen 特别在这个帖子
http://bbs.csdn.net/topics/340256535 里提到,二进制需要转成16进制再通过Cstring获取,如果是这个问题,哪位可以指点一下在STL(非MFC)下怎么实现这个转换呢?
谢谢!我分不多,可以全部给你。