最近我发布了一些关于桌面图标的有趣视频,例如哎呀,我的桌面疯掉了,我的电脑会替我说爱你,里面利用图标摆出各种各样的造型,还有桌面上的图标可以玩贪吃蛇,天哪,技术宅们的电脑这么神奇吗?用图标玩起了贪吃蛇。
摆成I的字母形状
摆成原型
有些朋友以为这是病毒,其实只是我自己写了一些自娱自乐的小程序。因为有些朋友想学,在这给大家做一个教程科普一下做法,如果大家喜欢请留言,我会根据大家的反馈继续推出更多好玩的教程和视频。言归正传,下面是正餐时间(代码为C#编写):
我们首先定义一些常量,LVM_GETITEMCOUNT,LVM_SETITEMPOSITION代表了两个操作指令,一个是用来获取图标的个数,一个用来修改图标的位置。
constuint LVM_FIRST = 0x1000;
constuint LVM_GETITEMCOUNT = LVM_FIRST + 4;
constuint LVM_SETITEMPOSITION = LVM_FIRST + 15;
接下来我们来定义两个方法,ListView_GetItemCount用来获取桌面上图标的个数,它的参数为图标所在容器的句柄(看不懂没关系,下面有具体用法)。
publicint ListView_GetItemCount(IntPtr AHandle)
{
return SendMessage(AHandle, LVM_GETITEMCOUNT, 0, 0);
}
ListView_SetItemPosition用来设定图标的位置,它的参数为图标所在的容器的句柄,要设定图标的标号(第几个),目标位置的坐标X和Y。
public void ListView_SetItemPosition(IntPtr AHandle, int AIndex, int X, int Y)
{
SendMessage(vHandle, LVM_SETITEMPOSITION, AIndex, Y* 0x10000 + X);
}
我们看到这两个函数里面都调用了SendMessage方法,其作用是往存放图标的容器发送消息来执行特定的动作。例如SendMessage(AHandle, LVM_GETITEMCOUNT, 0, 0);含义为告诉AHandle这个容器LVM_GETITEMCOUNT消息要求其返回图标的个数。
下面是一个让图标消失的小例子:
桌面上图标是放在一个容器里的,要控制它我们首先要找到图标所在的容器。
IntPtr vHandle = FindWindow("Progman", null);
vHandle = FindWindowEx(vHandle, In, "SHELLDLL_DefView", null);
vHandle = FindWindowEx(vHandle, In, "SysListView32", null);
此时vHandle就是容器的句柄了,把它作为参数调用获取图标个数的函数
int vItemCount = ListView_GetItemCount(vHandle);
vItemCount就是图标的数量,下面我们循环把所有的图标位置都设为(-100,-100)
for (int i = 0; i < vItemCount; i++){
ListView_SetItemPosition(vHandle, i, -100, -100);
}
为什么是-100呢,因为桌面左上角坐标为0,0,都设为-100图标就都放在屏幕外了,整体效果就是图标都消失了。当然可以发挥想象,设置其他值来摆些漂亮的造型。
更多好玩创意视频、程序欢迎关注我的头条号,或者微博6liwe9。