我想获取treeview所有节点的文本
现在有两个问题:
1 GetItemText 获得的文本全是乱码
2 遍历不能获得所有的节点 应该是有逻辑错误 public void Bianli(IntPtr Root,IntPtr TreeViewHwnd)
{
IntPtr XD = GetNextItem(TreeViewHwnd, Root);
if (!XD.Equals(IntPtr.Zero)) //当前节点是否有兄弟节点
Bianli(XD, TreeViewHwnd);
IntPtr CHILD = GetCHILDItem(TreeViewHwnd, Root);
if (!CHILD.Equals(IntPtr.Zero)) //当前节点是否有子节点
Bianli(TreeViewHwnd, CHILD); s += GetItemText(TreeViewHwnd, Root);
}
//获取下一个同级节点
public static IntPtr GetNextItem(IntPtr TreeViewHwnd, IntPtr PrevHwnd)
{
int mbHwnd = 0;
mbHwnd = SendMessage(TreeViewHwnd.ToInt32(), TVM_GETNEXTITEM, new IntPtr(TVGN_NEXT), PrevHwnd);
return new IntPtr(mbHwnd);
}
//获取第一个子节点
public static IntPtr GetCHILDItem(IntPtr TreeViewHwnd, IntPtr PrevHwnd)
{
int mbHwnd = 0;
mbHwnd = SendMessage(TreeViewHwnd.ToInt32(), TVM_GETNEXTITEM, new IntPtr(TVGN_CHILD), PrevHwnd);
return new IntPtr(mbHwnd);
}
//获取指定项文本
public static string GetItemText(IntPtr TreeViewHwnd, IntPtr ItemHwnd)
{
IntPtr hStr = Marshal.AllocHGlobal(1024);
TVITEM tv = new TVITEM();
tv.hItem = ItemHwnd;
tv.mask = TVIF_TEXT;
tv.pszText = hStr;
tv.cchTextMax = 1024;
StringBuilder sb = new StringBuilder(1024);
int result = SendMessage(TreeViewHwnd.ToInt32(), TVM_GETITEM, new IntPtr(0), tv);
int iCopy = CopyMemory(sb, hStr, 1024);
Marshal.FreeHGlobal(hStr);
return sb.ToString();
}
现在有两个问题:
1 GetItemText 获得的文本全是乱码
2 遍历不能获得所有的节点 应该是有逻辑错误 public void Bianli(IntPtr Root,IntPtr TreeViewHwnd)
{
IntPtr XD = GetNextItem(TreeViewHwnd, Root);
if (!XD.Equals(IntPtr.Zero)) //当前节点是否有兄弟节点
Bianli(XD, TreeViewHwnd);
IntPtr CHILD = GetCHILDItem(TreeViewHwnd, Root);
if (!CHILD.Equals(IntPtr.Zero)) //当前节点是否有子节点
Bianli(TreeViewHwnd, CHILD); s += GetItemText(TreeViewHwnd, Root);
}
//获取下一个同级节点
public static IntPtr GetNextItem(IntPtr TreeViewHwnd, IntPtr PrevHwnd)
{
int mbHwnd = 0;
mbHwnd = SendMessage(TreeViewHwnd.ToInt32(), TVM_GETNEXTITEM, new IntPtr(TVGN_NEXT), PrevHwnd);
return new IntPtr(mbHwnd);
}
//获取第一个子节点
public static IntPtr GetCHILDItem(IntPtr TreeViewHwnd, IntPtr PrevHwnd)
{
int mbHwnd = 0;
mbHwnd = SendMessage(TreeViewHwnd.ToInt32(), TVM_GETNEXTITEM, new IntPtr(TVGN_CHILD), PrevHwnd);
return new IntPtr(mbHwnd);
}
//获取指定项文本
public static string GetItemText(IntPtr TreeViewHwnd, IntPtr ItemHwnd)
{
IntPtr hStr = Marshal.AllocHGlobal(1024);
TVITEM tv = new TVITEM();
tv.hItem = ItemHwnd;
tv.mask = TVIF_TEXT;
tv.pszText = hStr;
tv.cchTextMax = 1024;
StringBuilder sb = new StringBuilder(1024);
int result = SendMessage(TreeViewHwnd.ToInt32(), TVM_GETITEM, new IntPtr(0), tv);
int iCopy = CopyMemory(sb, hStr, 1024);
Marshal.FreeHGlobal(hStr);
return sb.ToString();
}
解决方案 »
- 初学者问题之十一:C#中的List<T>能直接当T类型的数组用吗?
- windows ce(着急呀)
- 关于datagridviewcell的positioneditingcontrol的问题
- 我加了连接字符串是否加密的XML,但是还是不行,为什么呢
- 截取两个不同字符串之间的字符
- VISTA系统 为什么看不到windows身份验证选项
- winform下datagrid如何在无数据记录时可以显示出表头?
- C#项目进入调试问题:是不是Windows应用程序才可以调试,Windows服务无法调试的?
- 关于PrintDialog的设置问题~~~帮忙看看
- ======区分在哪里=====
- 用mouseclick事件在picturebox获取的坐标不准确??
- 我是新手,SendMassage发送组合键,比如Alt+E
{
string output = string.Empty; uint vProcessId;
/* WINAPI */ GetWindowThreadProcessId(TreeViewHwnd, out vProcessId);
IntPtr vProcess = /* WINAPI */ OpenProcess(
PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE,
false,
vProcessId
);
IntPtr vPointer = /* WINAPI */ VirtualAllocEx(
vProcess,
IntPtr.Zero,
4096,
MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE
); try
{
byte[] vBuffer = new byte[1024];
LVITEM[] vItem = new LVITEM[1];
vItem[0] = new LVITEM();
vItem[0].mask = LVIF_TEXT;
vItem[0].ItemHwnd = ItemHwnd;
vItem[0].iSubItem = 0;
vItem[0].pszText = (IntPtr)((int)vPointer + Marshal.SizeOf(typeof(LVITEM)));
vItem[0].cchTextMax = vBuffer.Length;
uint vNumberOfBytesRead = 0;
/* WINAPI */ WriteProcessMemory(
vProcess,
vPointer,
Marshal.UnsafeAddrOfPinnedArrayElement(vItem, 0),
(uint)Marshal.SizeOf(typeof(LVITEM)),
out vNumberOfBytesRead
);
SendMessage(TreeViewHwnd, LVM_GETITEMW, IntPtr.Zero, vPointer);
/* WINAPI */ ReadProcessMemory(
vProcess,
new IntPtr(vPointer.ToInt32() + Marshal.SizeOf(typeof(LVITEM))),
Marshal.UnsafeAddrOfPinnedArrayElement(vBuffer, 0),
(uint)vBuffer.Length,
out vNumberOfBytesRead
); output = Marshal.PtrToStringAuto(Marshal.UnsafeAddrOfPinnedArrayElement(vBuffer, 0));
}
finally
{
/* WINAPI */ VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);
/* WINAPI */ CloseHandle(vProcess);
} return output;
}
2、递归应该是先遍历当前节点的所有子节点,再遍历其兄弟节点,大概是这样public void Bianli(IntPtr Root,IntPtr TreeViewHwnd)
{
IntPtr CHILD = IntPtr.Zero;
do
{
CHILD = GetCHILDItem(TreeViewHwnd, Root);
if (!CHILD.Equals(IntPtr.Zero)) //当前节点是否有子节点
Bianli(TreeViewHwnd, CHILD);
}
while (!CHILD.Equals(IntPtr.Zero));
IntPtr XD = IntPtr.Zero;
do
{
XD = GetNextItem(TreeViewHwnd, Root);
if (!XD.Equals(IntPtr.Zero)) //当前节点是否有兄弟节点
Bianli(XD, TreeViewHwnd);
}
while (!XD.Equals(IntPtr.Zero));
s += GetItemText(TreeViewHwnd, Root);
}
{
string output = string.Empty; uint vProcessId;
/* WINAPI */ GetWindowThreadProcessId(TreeViewHwnd, out vProcessId);
IntPtr vProcess = /* WINAPI */ OpenProcess(
PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE,
false,
vProcessId
);
IntPtr vPointer = /* WINAPI */ VirtualAllocEx(
vProcess,
IntPtr.Zero,
4096,
MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE
); try
{
byte[] vBuffer = new byte[1024];
TVITEM[] vItem = new TVITEM[1];
vItem[0] = new TVITEM();
vItem[0].mask = TVIF_TEXT;
vItem[0].hItem = ItemHwnd;
vItem[0].pszText = (IntPtr)((int)vPointer + Marshal.SizeOf(typeof(TVITEM)));
vItem[0].cchTextMax = vBuffer.Length;
uint vNumberOfBytesRead = 0;
/* WINAPI */ WriteProcessMemory(
vProcess,
vPointer,
Marshal.UnsafeAddrOfPinnedArrayElement(vItem, 0),
(uint)Marshal.SizeOf(typeof(TVITEM)),
out vNumberOfBytesRead
);
SendMessage(TreeViewHwnd, TVM_GETITEMW, IntPtr.Zero, vPointer);
/* WINAPI */ ReadProcessMemory(
vProcess,
new IntPtr(vPointer.ToInt32() + Marshal.SizeOf(typeof(TVITEM))),
Marshal.UnsafeAddrOfPinnedArrayElement(vBuffer, 0),
(uint)vBuffer.Length,
out vNumberOfBytesRead
); output = Marshal.PtrToStringAuto(Marshal.UnsafeAddrOfPinnedArrayElement(vBuffer, 0));
}
finally
{
/* WINAPI */ VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);
/* WINAPI */ CloseHandle(vProcess);
} return output;
}
而Marshal.UnsafeAddrOfPinnedArrayElement(vItem, 0)返回值为IntPtr类型
这个怎么转换啊
WriteProcessMemory和ReadProcessMemory的最后一个参数都是out vNumberOfBytesRead
但是一个要求int 一个要求UIntPtr类型,肿么弄?
public static extern bool ReadProcessMemory(
IntPtr hProcess,
IntPtr lpBaseAddress,
IntPtr lpBuffer,
uint nSize,
out uint lpNumberOfBytesRead
);[DllImport("Kernel32.dll", SetLastError = true)]
public static extern bool WriteProcessMemory(
IntPtr hProcess,
IntPtr lpBaseAddress,
IntPtr lpBuffer,
uint nSize,
out uint lpNumberOfBytesWritten
);
[email protected]
不知道这个treeview的每一个文本是不是对应一个value 怎么获取呢?