C#如何获取任务管理器ListView控件中的内容Word文档下载推荐.docx
- 文档编号:19385978
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:12
- 大小:108.65KB
C#如何获取任务管理器ListView控件中的内容Word文档下载推荐.docx
《C#如何获取任务管理器ListView控件中的内容Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《C#如何获取任务管理器ListView控件中的内容Word文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。
∙ReadProcessMemory
//从指定内存中读取字节集数据
∙WriteProcessMemory
//将数据写入内存中
∙CloseHandle
∙VirtualFreeEx
//在其它进程中释放申请的虚拟内存空间
[csharp]viewplaincopyprint?
using
System;
System.Collections.Generic;
System.ComponentModel;
System.Data;
System.Drawing;
System.Linq;
System.Text;
System.Threading.Tasks;
System.Windows.Forms;
System.Runtime.InteropServices;
namespace
读取其他软件listview控件的内容
{
public
partial
class
Form1
:
Form
int
hwnd;
//窗口句柄
process;
//进程句柄
pointer;
private
const
uint
LVM_FIRST
=
0x1000;
LVM_GETHEADER
+
31;
LVM_GETITEMCOUNT
4;
//获取列表行数
LVM_GETITEMTEXT
45;
//获取列表内的内容
LVM_GETITEMW
75;
HDM_GETITEMCOUNT
0x1200;
//获取列表列数
PROCESS_VM_OPERATION
0x0008;
//允许函数VirtualProtectEx使用此句柄修改进程的虚拟内存
PROCESS_VM_READ
0x0010;
//允许函数访问权限
PROCESS_VM_WRITE
0x0020;
//允许函数写入权限
MEM_COMMIT
//为特定的页面区域分配内存中或磁盘的页面文件中的物理存储
MEM_RELEASE
0x8000;
MEM_RESERVE
0x2000;
//保留进程的虚拟地址空间,而不分配任何物理存储
PAGE_READWRITE
LVIF_TEXT
0x0001;
[DllImport("
user32.dll"
)]//查找窗口
static
extern
FindWindow(
string
strClassName,
//窗口类名
strWindowName
//窗口标题
);
)]//在窗口列表中寻找与指定条件相符的第一个子窗口
FindWindowEx(
hwndParent,
//
handle
to
parent
window
hwndChildAfter,
child
className,
windowName
窗口标题
user32.DLL"
)]
SendMessage(int
hWnd,
Msg,
wParam,
lParam);
)]//找出某个窗口的创建者(线程或进程),返回创建者的标志符
GetWindowThreadProcessId(int
hwnd,out
processId);
kernel32.dll"
)]//打开一个已存在的进程对象,并返回进程的句柄
OpenProcess(uint
dwDesiredAccess,
bool
bInheritHandle,int
)]//为指定的进程分配内存地址:
成功则返回分配内存的首地址
VirtualAllocEx(int
hProcess,
IntPtr
lpAddress,
dwSize,
flAllocationType,
flProtect);
)]//从指定内存中读取字节集数据
ReadProcessMemory(
//被读取者的进程句柄
lpBaseAddress,//开始读取的内存地址
lpBuffer,
//数据存储变量
nSize,
//要写入多少字节
ref
vNumberOfBytesRead//读取长度
)]//将数据写入内存中
WriteProcessMemory(
hProcess,//由OpenProcess返回的进程句柄
lpBaseAddress,
//要写的内存首地址,再写入之前,此函数将先检查目标地址是否可用,并能容纳待写入的数据
//指向要写的数据的指针
//要写入的字节数
vNumberOfBytesRead
CloseHandle(int
handle);
)]//在其它进程中释放申请的虚拟内存空间
VirtualFreeEx(
hProcess,//目标进程的句柄,该句柄必须拥有PROCESS_VM_OPERATION的权限
lpAddress,//指向要释放的虚拟内存空间首地址的指针
dwFreeType//释放类型
///
<
summary>
LVITEM结构体,是列表视图控件的一个重要的数据结构
占空间:
4(int)x7=28个byte
/summary>
struct
LVITEM
//结构体
mask;
//说明此结构中哪些成员是有效的
iItem;
//项目的索引值(可以视为行号)从0开始
iSubItem;
//子项的索引值(可以视为列号)从0开始
state;
//子项的状态
stateMask;
//状态有效的屏蔽位
pszText;
//主项或子项的名称
cchTextMax;
//pszText所指向的缓冲区大小
}
Form1()
InitializeComponent();
LV列表总行数
ListView_GetItemRows(int
handle)
return
SendMessage(handle,LVM_GETITEMCOUNT,0,0);
LV列表总列数
ListView_GetItemCols(int
SendMessage(handle,
HDM_GETITEMCOUNT,
0,
0);
void
button1_Click(object
sender,
EventArgs
e)
headerhwnd;
//listview控件的列头句柄
rows,cols;
//listview控件中的行列数
processId;
//进程pid
hwnd
FindWindow("
#32770"
"
Windows
任务管理器"
FindWindowEx(hwnd,
null);
SysListView32"
//进程界面窗口的句柄,通过SPY获取
headerhwnd
SendMessage(hwnd,
LVM_GETHEADER,
//listview的列头句柄
rows=ListView_GetItemRows(hwnd);
//总行数,即进程的数量
cols
ListView_GetItemCols(headerhwnd);
//列表列数
GetWindowThreadProcessId(hwnd,
out
//打开并插入进程
process
OpenProcess(PROCESS_VM_OPERATION
|
PROCESS_VM_WRITE,
false,processId);
//申请代码的内存区,返回申请到的虚拟内存首地址
pointer
VirtualAllocEx(process,
IntPtr.Zero,
4096,
MEM_COMMIT,
PAGE_READWRITE);
string[,]
tempStr;
//二维数组
string[]
temp
new
string[cols];
tempStr=GetListViewItmeValue(rows,cols);
//将要读取的其他程序中的ListView控件中的文本内容保存到二维数组中
listView1.Items.Clear();
//清空LV控件信息
//输出数组中保存的其他程序的LV控件信息
for
(int
i
0;
rows;
i++)
j
cols;
j++
)
temp[j]=tempStr[i,j];
ListViewItem
lvi
ListViewItem(temp);
listView1.Items.Add(lvi);
从内存中读取指定的LV控件的文本内容
param
name="
rows"
>
要读取的LV控件的行数<
/param>
cols"
要读取的LV控件的列数<
returns>
取得的LV控件信息<
/returns>
GetListViewItmeValue(int
rows,int
cols)
tempStr
string[rows,cols];
//二维数组:
保存LV控件的文本信息
i++
byte[]
vBuffer
byte[256];
//定义一个临时缓冲区
LVITEM[]
vItem
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)));
//把数据写到vItem中
//pointer为申请到的内存的首地址
//UnsafeAddrOfPinnedArrayElement:
获取指定数组中指定索引处的元素的地址
WriteProcessMemory(process,pointer,Marshal.UnsafeAddrOfPinnedArrayElement(vItem,0),Marshal.SizeOf(typeof(LVITEM)),
vNumberOfBytesRead);
//发送LVM_GETITEMW消息给hwnd,将返回的结果写入pointer指向的内存空间
LVM_GETITEMW,i,pointer);
//从pointer指向的内存地址开始读取数据,写入缓冲区vBuffer中
ReadProcessMemory(process,((int)pointer
Marshal.SizeOf(typeof(LVITEM))),Marshal.UnsafeAddrOfPinnedArrayElement(vBuffer,0),vBuffer.Length,
vText
Encoding.Unicode.GetString(vBuffer,
(int)vNumberOfBytesRead);
;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 如何 获取 任务 管理器 ListView 控件 中的 内容