c#下读取外部程序listview控件,已经取得行数,但读出内容为空值?
我需要读取外部程序的listview控件的文本信息,主要参考了http://www.cnblogs.com/hongfei/archive/2012/12/24/2829...
我需要读取外部程序的listview控件的文本信息,主要参考了http://www.cnblogs.com/hongfei/archive
/2012/12/24/2829799.html这个帖子,我用这里的代码在测试,确实可以取得任务管理器的listview的内容;但是我实际项目中
的目标程序,虽然在spy查看下,也是SysListView32,并且我调试中,发现
rows = ListView_GetItemRows(hwnd);//总行数,即进程的数量
cols = ListView_GetItemCols(headerhwnd);//列表列数
这两个行数和列数都已经正确获取值了,但却怎么也获取不到每行的文本值。
这段代码如下
tempStr = GetListViewItmeValue(rows, cols);//将要读取的其他程序中的ListView控件中的文本内容保存到二维数组中
....
/// <summary>
/// 从内存中读取指定的LV控件的文本内容
/// </summary>
/// <param name="rows">要读取的LV控件的行数</param>
/// <param name="cols">要读取的LV控件的列数</param>
/// <returns>取得的LV控件信息</returns>
privatestring[,] GetListViewItmeValue(introws, intcols)
{
string[,] tempStr = newstring[rows, cols];//二维数组:保存LV控件的文本信息
for(inti = 0; i < rows; i++)
{
for(intj = 0; j < cols; j++)
{
byte[] vBuffer = newbyte[256];//定义一个临时缓冲区
LVITEM[] vItem = newLVITEM[1];
vItem[0].mask = LVIF_TEXT;//说明pszText是有效的
vItem[0].iItem = i; //行号
vItem[0].iSubItem = j; //列号
vItem[0].cchTextMax = vBuffer.Length;//所能存储的最大的文本为256字节
vItem[0].pszText = (IntPtr)((int)pointer + Marshal.SizeOf(typeof(LVITEM)));
uintvNumberOfBytesRead = 0;
//把数据写到vItem中
//pointer为申请到的内存的首地址
//UnsafeAddrOfPinnedArrayElement:获取指定数组中指定索引处的元素的地址
WriteProcessMemory(process, pointer, Marshal.UnsafeAddrOfPinnedArrayElement(vItem, 0), Marshal.SizeOf(typeof(LVITEM)), refvNumberOfBytesRead);
//发送LVM_GETITEMW消息给hwnd,将返回的结果写入pointer指向的内存空间
intsd= SendMessage(hwnd, LVM_GETITEMW, i, pointer);
//从pointer指向的内存地址开始读取数据,写入缓冲区vBuffer中
booler =ReadProcessMemory(process, ((int)pointer + Marshal.SizeOf(typeof(LVITEM))), Marshal.UnsafeAddrOfPinnedArrayElement(vBuffer, 0), vBuffer.Length, refvNumberOfBytesRead);
stringvText = Encoding.Unicode.GetString(vBuffer, 0, (int)vNumberOfBytesRead);//这里得到的总是\0\0\0\0\0
tempStr[i, j] = vText;
}
}
VirtualFreeEx(process, pointer, 0, MEM_RELEASE);//在其它进程中释放申请的虚拟内存空间,MEM_RELEASE方式很彻底,完全回收
CloseHandle(process);//关闭打开的进程对象
returntempStr;
}
上述代码我在调试中发现,string vText 这里得到的总是\0\0\0\0\0,所以最后得到的tempStr 都是\0\0\0....全部是空值。
同样的代码,为什么获取任务管理器成功,我自己的listview 又失败呢?是不是目标程序使用了什么保护手段以至于无法获取数据?
求教高手! 展开
/2012/12/24/2829799.html这个帖子,我用这里的代码在测试,确实可以取得任务管理器的listview的内容;但是我实际项目中
的目标程序,虽然在spy查看下,也是SysListView32,并且我调试中,发现
rows = ListView_GetItemRows(hwnd);//总行数,即进程的数量
cols = ListView_GetItemCols(headerhwnd);//列表列数
这两个行数和列数都已经正确获取值了,但却怎么也获取不到每行的文本值。
这段代码如下
tempStr = GetListViewItmeValue(rows, cols);//将要读取的其他程序中的ListView控件中的文本内容保存到二维数组中
....
/// <summary>
/// 从内存中读取指定的LV控件的文本内容
/// </summary>
/// <param name="rows">要读取的LV控件的行数</param>
/// <param name="cols">要读取的LV控件的列数</param>
/// <returns>取得的LV控件信息</returns>
privatestring[,] GetListViewItmeValue(introws, intcols)
{
string[,] tempStr = newstring[rows, cols];//二维数组:保存LV控件的文本信息
for(inti = 0; i < rows; i++)
{
for(intj = 0; j < cols; j++)
{
byte[] vBuffer = newbyte[256];//定义一个临时缓冲区
LVITEM[] vItem = newLVITEM[1];
vItem[0].mask = LVIF_TEXT;//说明pszText是有效的
vItem[0].iItem = i; //行号
vItem[0].iSubItem = j; //列号
vItem[0].cchTextMax = vBuffer.Length;//所能存储的最大的文本为256字节
vItem[0].pszText = (IntPtr)((int)pointer + Marshal.SizeOf(typeof(LVITEM)));
uintvNumberOfBytesRead = 0;
//把数据写到vItem中
//pointer为申请到的内存的首地址
//UnsafeAddrOfPinnedArrayElement:获取指定数组中指定索引处的元素的地址
WriteProcessMemory(process, pointer, Marshal.UnsafeAddrOfPinnedArrayElement(vItem, 0), Marshal.SizeOf(typeof(LVITEM)), refvNumberOfBytesRead);
//发送LVM_GETITEMW消息给hwnd,将返回的结果写入pointer指向的内存空间
intsd= SendMessage(hwnd, LVM_GETITEMW, i, pointer);
//从pointer指向的内存地址开始读取数据,写入缓冲区vBuffer中
booler =ReadProcessMemory(process, ((int)pointer + Marshal.SizeOf(typeof(LVITEM))), Marshal.UnsafeAddrOfPinnedArrayElement(vBuffer, 0), vBuffer.Length, refvNumberOfBytesRead);
stringvText = Encoding.Unicode.GetString(vBuffer, 0, (int)vNumberOfBytesRead);//这里得到的总是\0\0\0\0\0
tempStr[i, j] = vText;
}
}
VirtualFreeEx(process, pointer, 0, MEM_RELEASE);//在其它进程中释放申请的虚拟内存空间,MEM_RELEASE方式很彻底,完全回收
CloseHandle(process);//关闭打开的进程对象
returntempStr;
}
上述代码我在调试中发现,string vText 这里得到的总是\0\0\0\0\0,所以最后得到的tempStr 都是\0\0\0....全部是空值。
同样的代码,为什么获取任务管理器成功,我自己的listview 又失败呢?是不是目标程序使用了什么保护手段以至于无法获取数据?
求教高手! 展开
展开全部
GetListViewItmeValue(introws, intcols)
在listview里面有这样的用法吗?你的程序不报错已是奇迹了。
listview不像datagridview或者datatable,
它的列不是用col来索引的,而是
listview.item[itemindex].subitems[subitemindex].text
在listview里面有这样的用法吗?你的程序不报错已是奇迹了。
listview不像datagridview或者datatable,
它的列不是用col来索引的,而是
listview.item[itemindex].subitems[subitemindex].text
追问
谢谢你的回答,不过请看清我的问题,难道你没看到那个GetListViewItmeValue是我自定义的方法吗?此外我的程序并未报错,就是取不到值。
追答
你这是c#代码吗?请参考c#单元测试里面的类,比你用句柄什么的好。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询