当前位置:编程学习 > C#/ASP.NET >>

c#下读取外部程序listview控件,已经取得行数,但读出内容为空值?

小弟我需要读取外部程序的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>
        private string[,] GetListViewItmeValue(int rows, int cols)
        {
            string[,] tempStr = new string[rows, cols];//二维数组:保存LV控件的文本信息
            for (int i = 0; i < rows; i++)
            {
                for (int j = 0; j < cols; j++)
                {
                    byte[] vBuffer = new byte[256];//定义一个临时缓冲区
                    LVITEM[] vItem = new LVITEM[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)));
                    uint vNumberOfBytesRead = 0;

                    //把数据写到vItem中
                    //pointer为申请到的内存的首地址
                    //UnsafeAddrOfPinnedArrayElement:获取指定数组中指定索引处的元素的地址
                    WriteProcessMemory(process, pointer, Marshal.UnsafeAddrOfPinnedArrayElement(vItem, 0), Marshal.SizeOf(typeof(LVITEM)), ref vNumberOfBytesRead);

                    //发送LVM_GETITEMW消息给hwnd,将返回的结果写入pointer指向的内存空间
                   int sd= SendMessage(hwnd, LVM_GETITEMW, i, pointer);

                    //从pointer指向的内存地址开始读取数据,写入缓冲区vBuffer中
                    bool er =ReadProcessMemory(process, ((int)pointer + Marshal.SizeOf(typeof(LVITEM))), Marshal.UnsafeAddrOfPinnedArrayElement(vBuffer, 0), vBuffer.Length, ref vNumberOfBytesRead);

                    string vText = 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);//关闭打开的进程对象
            return tempStr;
        }


上述代码我在调试中发现,string vText 这里得到的总是\0\0\0\0\0,所以最后得到的tempStr 都是\0\0\0....全部是空值。

同样的代码,为什么获取任务管理器成功,我自己的listview 又失败呢?是不是目标程序使用了什么保护手段以至于无法获取数据?
求教高手!  --------------------编程问答-------------------- 另外我参考了几个vb的程序,对于任务管理器也可以争取取值,但是在我调试中,对于我需要取数据的listview控件,仍然是取不到值。。。。

不知有没有高手了解这种情况,谢谢!! --------------------编程问答-------------------- 楼主解决了吗?同求方法 --------------------编程问答--------------------
引用 2 楼 flyer_ren 的回复:
楼主解决了吗?同求方法


听说你已经解决了,可以分享一下么,谢谢 --------------------编程问答--------------------
引用 3 楼 wwwww112233 的回复:
Quote: 引用 2 楼 flyer_ren 的回复:

楼主解决了吗?同求方法


听说你已经解决了,可以分享一下么,谢谢

我也没啥说的,用spy++一层层找窗口句柄,一直找到listview那层后在用上面的那些代码读取就行了 --------------------编程问答-------------------- 求楼主公布一下答案。。。。。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,