当前位置:文档之家› 如何操作桌面上的图标

如何操作桌面上的图标

如何操作桌面上的图标,并取得图标的信息2012 年 2 月 19 日 | Filed under: Windows程序设计 and tagged with: Windows API桌面图标是放在 SysListView32这个列表中,所以要想操作图标,要先得到了它的句柄,然后可以遍历它得到各桌面图标的句柄,下面的代码实现把桌面上的图标排成一个圆:12 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2void C***::OnSetDeskIcon(){HWNDhwndParent = ::FindWindow("Progman","Program Manager");HWNDhwndSHELLDLL_DefView = ::FindWindowEx( hwndParent,NULL,"SHELLDLL_DefView", NULL );HWNDhwndSysListView32 = ::FindWindowEx( hwndSHELLDLL_DefView, NULL,"SysListView32","FolderView");intNm = ListView_GetItemCount( hwndSysListView32 );//取得图标的数目for(inti = 0; i < Nm; i++ ){intx = 400 + 150*cos( i * 2 * 3.1415926/Nm );inty = 400 + 150*sin( i * 2 * 3.1415926/Nm );::SendMessage( hwndSysListView32, LVM_SETITEMPOSITION, i,MAKELPARAM( x,y));}ListView_RedrawItems(hwndSysListView32, 0,ListView_GetItemCount(hwndSysListView32) - 1);::UpdateWindow(hwndSysListView32);}3242526272829331323334操作了图标,那么怎样得到图标的信息呢,如图标的名称,大小,位置等等,在上一篇文章Stealing Program's Memory 中提到了怎样取得别的进程中的信息,下面的代码实现了取得图标名称、位置、大小的功能:1 2 3 4 5 6 7 8 9 10 11 12 13 void C***::OnSetDeskIcon(){HWNDhDestTop;hDestTop = ::FindWindow("progman", NULL);hDestTop = ::FindWindowEx(hDestTop, 0,"shelldll_defview",NULL);hDestTop = ::FindWindowEx(hDestTop, 0,"syslistview32",NULL);intcount=(int)::SendMessage( hDestTop, LVM_GETITEMCOUNT,0, 0);LVITEM lvi, *_lvi;charitem[512], subitem[512];char*_item, *_subitem;unsignedlongpid;HANDLEprocess;GetWindowThreadProcessId( hDestTop, &pid);process=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, pid);_lvi=(LVITEM*)VirtualAllocEx(process, NULL,sizeof (LVITEM), MEM_COMMIT, PAGE_READWRITE);_item=(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT, PAGE_READWRITE);_subitem=(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT, PAGE_READWRITE);RECT rc;rc.left = LVIR_ICON;//这个一定要设定 可以去看MSDN 关于LVM_GETITEMRECT 的说明 RECT* _rc =(RECT*)VirtualAllocEx( process, NULL,sizeof (RECT), MEM_COMMIT, PAGE_READWRITE);hTextMax=512;for (inti=0; i< 10; i++){lvi.iSubItem=0;lvi.pszText=_item;WriteProcessMemory(process, _lvi, &lvi,sizeof (LVITEM),NULL);::SendMessage( hDestTop, LVM_GETITEMTEXT, (WPARAM)i,(LPARAM)_lvi);lvi.iSubItem=1;lvi.pszText=_subitem;WriteProcessMemory(process, _lvi, &lvi,sizeof (LVITEM),NULL);::SendMessage( hDestTop, LVM_GETITEMTEXT, (WPARAM)i,(LPARAM)_lvi);::WriteProcessMemory( process, _rc, &rc,sizeof (rc), NULL); ::SendMessage( hDestTop, LVM_GETITEMRECT, (WPARAM)i,(LPARAM)_rc);ReadProcessMemory(process, _item, item, 512, NULL);ReadProcessMemory(process, _subitem, subitem, 512, NULL);ReadProcessMemory(process, _rc, &rc,sizeof (rc), NULL);CString str;str.Format("LF:%d TP:%d RT:%d BT:%d",rc.left,rc.top,rc.right,rc.bottom);AfxMessageBox(str);36 37 38 39 40 41 4243444546474849551525354555657str.Format("%s - %s\n", item, subitem);AfxMessageBox( str );}VirtualFreeEx(process, _lvi, 0, MEM_RELEASE);VirtualFreeEx(process, _item, 0, MEM_RELEASE);VirtualFreeEx(process, _subitem, 0, MEM_RELEASE);VirtualFreeEx(process, _rc, 0, MEM_RELEASE);CloseHandle( process );}585966162636465666768697717273点击这里,查看原问题的讨论好了,我们学会了操作桌面的图标,可以得到图标的大小和位置信息,我们可以写一个有趣的游戏,这个游戏操作桌面上的图标来组成贪吃蛇。

可以点击这里下载这个程序的源代码。

这个程序使用了键盘钩子,我直接在王艳平的《Windows程序设计》这本书第九章中附带的源代码--09KeyHookApp的基础上修改而来。

为了完成这个程序,我们需要掌握的知识有:MFC设定定时器:每一个时间点发生,移动蛇的身子。

获取桌面图标信息,并能移动图标:本文讲的很详细了。

Windows钩子:为了使我们的程序失去焦点时,蛇的移动不受影响,我们需要使用键盘钩子,时时监控键盘的输入,这样即使我们的程序被最小化,我们的程序依旧能够运行,有关钩子的使用的文章我会在以后编写完成后在这里给上链接。

-------------------------------------------------------------------------------------------------------------------取得桌面的ListView控件的窗口句柄桌面上面的所有图标都是摆放在桌面的ListView控件窗口内的。

所以首先要取得桌面的ListView控件的窗口句柄:1 2 3 4 5 6 7 8 9 HWNDhwndParent;HWNDhwndSHELLDLL_DefView ;HWNDhwndSysListView32;hwndParent = ::FindWindow("Progman","Program Manager"); hwndSHELLDLL_DefView = ::FindWindowEx( hwndParent, NULL,"SHELLDLL_DefView", NULL ); hwndSysListView32 = ::FindWindowEx( hwndSHELLDLL_DefView, NULL,"SysListView32","FolderView");上面的这段代码首先查找一个类别(class)为ProgMan的窗口。

即使任务管理器(Program Manager)应用程序没有运行,Windows外壳仍然会创建一个类别为ProgMan 的窗口,其目的是为了向后兼容那些为老版本Windows设计的应用程序。

这个ProgMan 窗口有且只有一个类别为SHELLDLL_DefView的子窗口,这个子窗口同样有且只有一个子窗口,子窗口的类别为SysListView32。

这个SysListView32窗口就是桌面的ListView 控件窗口。

相关主题