以下代码在Windows XP中运行良好,并且一度在Windows 7中运行,但不再有效。我似乎无法弄清楚为什么不幸。还有其他人有问题吗?
更具体地说,它会发现所有图标及其位置没有问题。具体的图标名是返回/ 0/0/0/0/0/0/0/0/0/0/0/0/0/0 0 ... ....
WriteProcessMemory(vProcess, vPointer, Marshal.UnsafeAddrOfPinnedArrayElement(vItem, 0),Marshal.SizeOf(typeof(LVITEM)), ref vNumberOfBytesRead);
SendMessage(vHandle, LVM_GETITEMW, j, vPointer.ToInt32());
ReadProcessMemory(vProcess, (IntPtr)((int)vPointer + Marshal.SizeOf(typeof(LVITEM))), Marshal.UnsafeAddrOfPinnedArrayElement(vBuffer, 0), vBuffer.Length, ref vNumberOfBytesRead);
string vText = Encoding.Unicode.GetString(vBuffer, 0, (int)vNumberOfBytesRead);
string IconName = Marshal.PtrToStringAnsi(vItem[0].pszText);
vText和IconName都没有显示任何内容:(
对于pszText,我尝试了两种方法:
vItem[0].pszText = (IntPtr)((int)vPointer + Marshal.SizeOf(typeof(LVITEM)));
vItem[0].pszText = Marshal.AllocHGlobal(512);
仅供参考:
private const int LVM_FIRST = 0x1000;
private const uint LVM_GETITEMW = LVM_FIRST + 75;
完整代码:(忽略所有额外的Console.WriteLines,我正在调试) http://pastebin.com/RXd2uwx3
答案 0 :(得分:1)
我遇到了同样的问题。
可能是您的代码在x64版本的windows7下运行。 在默认的C#构建设置中,IntPtr大小被视为32位int指针。 但ReadProcessMemory是64位int指针。
你必须将VS的构建选项更改为[AnyCPU]为[x64], 你的代码将运行良好。