LVM_GETITEMTEXT 向桌面发送这个消息就崩溃了

move_web 2015-11-08 08:08:42
int main() {

HWND listview = FindWindow(_T("progman"), NULL); //获取桌面句柄
listview = FindWindowEx(listview, 0, _T("shelldll_defview"), NULL); //获取桌面shelldll_defview子窗口句柄
listview = FindWindowEx(listview, 0, _T("syslistview32"), NULL); //获取桌面syslistview32子窗口句柄

int count = (int)SendMessage(listview, LVM_GETITEMCOUNT, 0, 0);//获取桌面图标个数
printf("桌面总共有%d个图标!\n", count);

LVITEM lvi, *_lvi;//声明一个列表视图控件数据结构和一个指针
char item[512];//声明一个char数组
char *_item;//声明一个char指针
unsigned long pid;// 声明一个无符号长整数变量
HANDLE process;//声明一个句柄变量

GetWindowThreadProcessId(listview, &pid);//获取桌面syslistview32子窗口的创建线程或者进程PID 并赋值给长整形变量 PID
process = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ |
PROCESS_VM_WRITE | PROCESS_QUERY_INFORMATION, FALSE, pid);//打开进程获取进程句柄

_lvi = (LVITEM*)VirtualAllocEx(process, NULL, sizeof(LVITEM),
MEM_COMMIT, PAGE_READWRITE);//在process内存中申请一个大小是一个列表视图控件数据结构大小的可读写内存空间 ,并且把指针赋值给_lvi
_item = (char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT,
PAGE_READWRITE);//在process内存中申请一个大小是512个char类型的可读写内存空间 ,并且把指针赋值给_item
if ((!_lvi) || (!_item))
MessageBox(NULL, _T("无法分配内存!", "错误!"),_T(""), NULL);
//lvi.mask = LVIF_TEXT;
lvi.cchTextMax = 512;//指定缓存区大小
lvi.pszText = LPWSTR(_item);//图标标题
lvi.iSubItem = 0;//0
int x = 50, y = 10;
for (int i = 0; i<count; i++) {
if(!(WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL))) MessageBox(NULL, _T("写入失败"), _T("错误!"),NULL);//把lvi写入到申请的内存空间_lvi
SendMessage(listview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);
//SendMessage(listview, LVM_SETITEMPOSITION, i, (LPARAM)MAKELPARAM(x, y));
if (i<3)
{
x = x + 80;
}
else if (i>2 && i<6)
{
y = y + 80;
}
else if (i>5 && i<9)
{
x = x - 80;
}
else if (i>8 && i<11) y = y - 80; else x = -100, y = -100;

ReadProcessMemory(process, _item, item, 512, NULL);
printf("%s的序号是%d\n", item, i);
}
VirtualFreeEx(process, _lvi, 0, MEM_RELEASE);//释放内存
VirtualFreeEx(process, _item, 0, MEM_RELEASE);//释放内存
system("pause");
return 0;
}

...全文
178 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-11-09
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧