C#net在winform中怎样获取c listview 获取选中当前选中的行

C#如何获取其他程序ListView控件中的内容
需求:获取其他程序中的ListView控件的文本内容 原理: 进程之间是相互隔离的,数据是不能共享的(有些特例) LVM_GETTITEMTEXT:将一个数据缓冲区提供给listview32控件,你不能把你的进程的数据缓冲提供给另外的程序,所以要用openprocess打开任务管理器进
需求:获取其他程序中的ListView控件的文本内容
原理:进程之间是相互隔离的,数据是不能共享的(有些特例)
   LVM_GETTITEMTEXT:将一个数据缓冲区提供给listview32控件,,你不能把你的进程的数据缓冲提供给另外的程序,所以要用openprocess&打开&任务管理器&进程,&然后   &&在&任务管理器进程&中申请足够长度的内存(VirualAllocEx),将这个内存地址提供给listview32,使用&sendmessage&发送LVM_GETTITEMTEXT消息,待sendmessage返 &    &&回后,用readprocessmemory&读取这段内存的数据,即listview控件的文本内容
&程序演示:
using System.Collections.G
using ponentM
using System.D
using System.D
using System.L
using System.T
using System.Threading.T
using System.Windows.F
using System.Runtime.InteropS
namespace 读取其他软件listview控件的内容
Form1 : Form
LVM_FIRST = 0x1000;
LVM_GETHEADER = LVM_FIRST + 31;
LVM_GETITEMCOUNT = LVM_FIRST + LVM_GETITEMTEXT = LVM_FIRST + LVM_GETITEMW = LVM_FIRST + 75;
HDM_GETITEMCOUNT = PROCESS_VM_OPERATION = PROCESS_VM_READ = PROCESS_VM_WRITE = MEM_COMMIT = MEM_RELEASE = 0x8000;
MEM_RESERVE = PAGE_READWRITE = 4;
private int LVIF_TEXT = 0x0001;
[DllImport()] FindWindow(
strWindowName
//窗口标题
[DllImport()] FindWindowEx(
int hwndParent, // handle to parent window
className, windowName // 窗口标题
[DllImport()]
SendMessage(int hWnd, uint Msg, int wParam, int lParam);
[DllImport()]GetWindowThreadProcessId(int hwnd,out int processId);
[DllImport()]OpenProcess(uint dwDesiredAccess, bool bInheritHandle,int processId);
[DllImport()]VirtualAllocEx(int hProcess, IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);
[DllImport()] ReadProcessMemory(
lpBaseAddress,//开始读取的内存地址
IntPtr lpBuffer, nSize, vNumberOfBytesRead//读取长度
[DllImport()] WriteProcessMemory(
lpBaseAddress, //要写的内存首地址,再写入之前,此函数将先检查目标地址是否可用,并能容纳待写入的数据
IntPtr lpBuffer, nSize,
vNumberOfBytesRead
[DllImport()]
CloseHandle(int handle);
[DllImport()] VirtualFreeEx(
lpAddress, dwSize,
uint dwFreeType//释放类型
LVITEM结构体,是列表视图控件的一个重要的数据结构
/// 占:4(int)x7=28个byte
iIiSubIstateM IntPtr pszT
cchTextM//pszText所指向的缓冲区大小
public Form1()
InitializeComponent();
LV列表总行数
ListView_GetItemRows(int handle)
return SendMessage(handle,LVM_GETITEMCOUNT,0,0);
LV列表总列数
ListView_GetItemCols(int handle)
return SendMessage(handle, HDM_GETITEMCOUNT, 0, 0);
private void button1_Click(object sender, EventArgs e)
processId; //进程pid
hwnd = FindWindow(, );
hwnd = FindWindowEx(hwnd, ,null);
hwnd = FindWindowEx(hwnd, ,null);//进程界面窗口的句柄,通过SPY获取
headerhwnd = SendMessage(hwnd, LVM_GETHEADER, 0, 0);//listview的列头句柄
rows=ListView_GetItemRows(hwnd);//总行数,,,即进程的数量
cols = ListView_GetItemCols(headerhwnd);//列表列数
GetWindowThreadProcessId(hwnd, out processId);
//打开并插入进程
process = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, false,processId);
//申请代码的内存区,返回申请到的虚拟内存首地址
pointer = VirtualAllocEx(process, IntPtr.Zero, 4096, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
[] temp = new string[cols];
tempStr=GetListViewItmeValue(rows,cols);//将要读取的其他程序中的ListView控件中的文本内容保存到二维数组中
listView1.Items.Clear();//清空LV控件信息
(int i = 0; i & i++)
for (int j = 0; j &j++ )
temp[j]=tempStr[i,j];
ListViewItem lvi = new ListViewItem(temp);
listView1.Items.Add(lvi);
从内存中读取指定的LV控件的文本内容
[,] GetListViewItmeValue(int rows,int cols)
(int i = 0; i &i++ )
for (int j = 0; j &j++ )
LVITEM[] vItem = new LVITEM[1];
vItem[0].mask = LVIF_TEXT;//说明pszText是有效的
vItem[0].iItem =
vItem[0].iSubItem =
vItem[0].cchTextMax = vBuffer.L//所能存储的最大的文本为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指向的内存
SendMessage(hwnd, LVM_GETITEMW,i,pointer);
//从pointer指向的内存地址开始读取数据,写入缓冲区vBuffer中
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); ;
tempStr[i,j] = vT
VirtualFreeEx(process, pointer, 0, MEM_RELEASE);//在其它进程中释放申请的虚拟内存空间,MEM_RELEASE方式很彻底,完全回收
CloseHandle(process); tempS
你最喜欢的ListView添加行的问题。-.NET技术/C#-c/c++-电脑编程网ListView添加行的问题。-.NET技术/C#作者:air 和相关&&while (reader.Read()){&
for (int i = 0; i & lvTable.Columns.C i++)&
查询表之后, 把查询的结果放到ListView中,但是查询的结果的列数 是不一定的,每次可能都不一样,
这样 那要把查询的一行记录添加到ListView中去 要怎么做?------回答---------------其他回答(2分)---------是不是 动态添加数据 的意思??&看看
这个 是否对你有帮助
http://topic.csdn.net/u//917ea006-8ce2-4fce-8b19-7a.html?------其他回答(3分)---------dt = new DataTable();&
dt.Columns.Add(&ID&,typeof(System.Int32));&
dt.Columns.Add(&ParentID&,typeof(System.Int32));&
dt.Columns.Add(&Name&);&
DataRow dr = dt.NewRow();&
dr[0] = 1;&
dr[1] = 0;&
dr[2] = &Test1&;&
dt.Rows.Add(dr);&
dr = dt.NewRow();&
dr[0] = 2;&
dr[1] = 0;&
dr[2] = &Test2&;&
dt.Rows.Add(dr);&
dr = dt.NewRow();&
dr[0] = 3;&
dr[1] = 1;&
dr[2] = &Test3&;&
dt.Rows.Add(dr);&
dr = dt.NewRow();&
dr[0] = 4;&
dr[1] = 1;&
dr[2] = &Test4&;&
dt.Rows.Add(dr);&
dr = dt.NewRow();&
dr[0] = 5;&
dr[1] = 1;&
dr[2] = &Test5&;&
dt.Rows.Add(dr);&
dr = dt.NewRow();&
dr[0] = 6;&
dr[1] = 5;&
dr[2] = &Test6&;&
dt.Rows.Add(dr);&
this.listView1.View = View.D&
this.listView1.Columns.Clear();&
foreach (DataColumn dc in dt.Columns)&
listView1.Columns.Add(dc.ColumnName);&
ListViewItem newItem =&
foreach (DataRow drs in dt.Rows)&
string[] Values = drs.ItemArray as string[];&
newItem = new ListViewItem(Values);&
this.listView1.Items.Add(newItem);&
}------其他回答(3分)---------参考C# code
LstCardView.Columns.Add(&类别编码&, 60, HorizontalAlignment.Left);
LstCardView.Columns.Add(&类别名称&, 80, HorizontalAlignment.Left);
LstCardView.Columns.Add(&方式&, 60, HorizontalAlignment.Left);
LstCardView.Columns.Add(&折扣&, 80, HorizontalAlignment.Left);
LstCardView.Columns.Add(&固定折扣&, 60, HorizontalAlignment.Left);
LstCardView.Columns.Add(&备注&, 120, HorizontalAlignment.Center);
int num = ds.Tables[0].Rows.C
for (int i = 0; i & i++)
ListViewItem lvi = new ListViewItem(ds.Tables[0].Rows[i][0].ToString());
lvi.SubItems.Add(ds.Tables[0].Rows[i][1].ToString());
lvi.SubItems.Add(ds.Tables[0].Rows[i][2].ToString());
lvi.SubItems.Add(ds.Tables[0].Rows[i][3].ToString());
lvi.SubItems.Add(ds.Tables[0].Rows[i][4].ToString());
lvi.SubItems.Add(ds.Tables[0].Rows[i][5].ToString());
lvi.SubItems.Add(ds.Tables[0].Rows[i][6].ToString());
lviYg.Items.Add(lvi);
添加列:ListView.Columns.Add(。。。)对应列动态添加数据:ListView.SubItems.Add(...)------其他回答(12分)---------C# code
ListView lv = new ListView();
//添加一行的方法
ListViewItem item = lv.Items.Add(&第一行的第一列&);
item.SubItems.Add(&第一行的第二列&);
item.SubItems.Add(&第一行的第三列&);
------回答---------------其他回答(2分)---------
是不是 动态添加数据 的意思?? &看看
这个 是否对你有帮助
http://topic.csdn.net/u//917ea006-8ce2-4fce-8b19-7a.html?------其他回答(3分)---------
dt = new DataTable(); &
dt.Columns.Add(&ID&,typeof(System.Int32)); &
dt.Columns.Add(&ParentID&,typeof(System.Int32)); &
dt.Columns.Add(&Name&); &
DataRow dr = dt.NewRow(); &
dr[0] = 1; &
dr[1] = 0; &
dr[2] = &Test1&; &
dt.Rows.Add(dr); &
dr = dt.NewRow(); &
dr[0] = 2; &
dr[1] = 0; &
dr[2] = &Test2&; &
dt.Rows.Add(dr); &
dr = dt.NewRow(); &
dr[0] = 3; &
dr[1] = 1; &
dr[2] = &Test3&; &
dt.Rows.Add(dr); &
dr = dt.NewRow(); &
dr[0] = 4; &
dr[1] = 1; &
dr[2] = &Test4&; &
dt.Rows.Add(dr); &
dr = dt.NewRow(); &
dr[0] = 5; &
dr[1] = 1; &
dr[2] = &Test5&; &
dt.Rows.Add(dr); &
dr = dt.NewRow(); &
dr[0] = 6; &
dr[1] = 5; &
dr[2] = &Test6&; &
dt.Rows.Add(dr); &
this.listView1.View = View.D &
this.listView1.Columns.Clear(); &
foreach (DataColumn dc in dt.Columns) &
listView1.Columns.Add(dc.ColumnName); &
ListViewItem newItem = &
foreach (DataRow drs in dt.Rows) &
string[] Values = drs.ItemArray as string[]; &
newItem = new ListViewItem(Values); &
this.listView1.Items.Add(newItem); &
}------其他回答(3分)---------参考C# code
LstCardView.Columns.Add(&类别编码&, 60, HorizontalAlignment.Left);
LstCardView.Columns.Add(&类别名称&, 80, HorizontalAlignment.Left);
LstCardView.Columns.Add(&方式&, 60, HorizontalAlignment.Left);
LstCardView.Columns.Add(&折扣&, 80, HorizontalAlignment.Left);
LstCardView.Columns.Add(&固定折扣&, 60, HorizontalAlignment.Left);
LstCardView.Columns.Add(&备注&, 120, HorizontalAlignment.Center);
int num = ds.Tables[0].Rows.C
for (int i = 0; i & i++)
ListViewItem lvi = new ListViewItem(ds.Tables[0].Rows[i][0].ToString());
lvi.SubItems.Add(ds.Tables[0].Rows[i][1].ToString());
lvi.SubItems.Add(ds.Tables[0].Rows[i][2].ToString());
lvi.SubItems.Add(ds.Tables[0].Rows[i][3].ToString());
lvi.SubItems.Add(ds.Tables[0].Rows[i][4].ToString());
lvi.SubItems.Add(ds.Tables[0].Rows[i][5].ToString());
lvi.SubItems.Add(ds.Tables[0].Rows[i][6].ToString());
lviYg.Items.Add(lvi);
添加列:ListView.Columns.Add(。。。)对应列动态添加数据:ListView.SubItems.Add(...)------其他回答(12分)---------C# code
ListView lv = new ListView();
//添加一行的方法
ListViewItem item = lv.Items.Add(&第一行的第一列&);
item.SubItems.Add(&第一行的第二列&);
item.SubItems.Add(&第一行的第三列&);
相关资料:|||||||ListView添加行的问题。-.NET技术/C#来源网络,如有侵权请告知,即处理!编程Tags:                &                    &&&&&&&&&&& //获取用户当前选择的行的数据
&&&&&&&&&&& string name=this.listViewAdmin.FocusedItem.SubItems[0].T
&&&&&&&&&&& name += &&&&&&&&&&&&& &;
&&&&&&&&&&& name += this.listViewAdmin.FocusedItem.SubItems[1].T
&&&&&&&&&&& MessageBox.Show(name);
阅读(...) 评论()C# listview中传递数据出错,获取第一个item的值怎么成了ListViewItem: {109}的形式了, C# listview中传递数据出错,获
C# listview中传递数据出错,获取第一个item的值怎么成了ListViewItem: {109}的形式了
君子衣 C# listview中传递数据出错,获取第一个item的值怎么成了ListViewItem: {109}的形式了
你应该是直接调用了ListViewItem.ToString()方法了
看你图中选中的就是109啊 selectedItems表示的不是选中的项吗c# 里listview 选择一行,这行高亮显示,在点击窗口中其他控件,让这个高亮显示的行变灰色显示, c# 里listview 选择一行,这行
c# 里listview 选择一行,这行高亮显示,在点击窗口中其他控件,让这个高亮显示的行变灰色显示 问题补充:
我是做 的winform 项目 ,是把那个本来高亮显示的行变成灰色,或者变成别的颜色 bewzxg c# 里listview 选择一行,这行高亮显示,在点击窗口中其他控件,让这个高亮显示的行变灰色显示
纳吧private void button1_Click(object sender.SelectedItems[0].Red.BackColor = Color, EventArgs e)
用css样式控制
可以将它变灰的属性就是 了啊这么 Enabled

我要回帖

更多关于 listview当前选中 的文章

 

随机推荐