保存和恢复桌面上的图标位置 - CodeProject
本文介绍如何在 Windows 桌面上保存和还原图标的位置。
  • 下载源代码 - 181.9 KB

介绍

最近,我的公司为我的笔记本电脑提供了一个扩展坞。这是一个不错的玩具,但很快我就遇到了一个小问题。重新启动后,我的笔记本电脑不时(实际上相当频繁)会忘记屏幕分辨率。它不会太困扰我,因为恢复屏幕分辨率既快速又简单。但问题是,使用分辨率时,它会忘记桌面上所有图标的位置。再次放置它们很容易,但速度不快,因为我有很多图标。

当然,有像IconRestorer和DesktopOK 9.73 Save and restore the desktop icon positions.https://www.softwareok.com/?seite=Freeware/DesktopOK这样的程序可以帮助我。但毕竟,我们是程序员,这是一个有趣的任务。所以,让旅程开始吧!

注册表

我谷歌了Windows存储有关桌面上图标位置的信息的位置。并且有一个很好的和简单的答案,这些信息存储在注册表项"CurrentUser\Software\Microsoft\Windows\Shell\Bags\1\Desktop"中。我知道如何使用注册表,这是一项简单的任务。但很快我就意识到这不是一个正确的答案。看起来 Windows 在登录时读取此信息并存储在注销时。我想在不重新启动计算机的情况下恢复图标的位置。所以我需要另一个解决方案。

PInvoke

我再次谷歌搜索,发现实际上桌面是某些进程中的控件。任何人都可以使用 Windows 的标准 API 向此控件发送消息。并得到一些结果。但这意味着我应该使用PInvoke技术来使用传统的Windows API。就个人而言,我对PInvoke感到不安。首先,您应该知道每个必需函数所在的 DLL。然后有不同的封送处理问题。我对此感到害怕。但幸运的是,我找到了一个很棒的网站:PInvoke.net。它非常易于使用,并且包含许多本机Windows函数和结构的.NET包装器,包括一些有用的重载。我肯定会在以后使用这个网站,并希望它也能帮助你。ListViewSendMessage

桌面流程

为了能够向控件发送消息,应获取其句柄 - Windows 中控件的唯一 ID。为了做到这一点,应该首先识别包含此控件的进程。在这里,我遇到了第一个问题。你看,Windows可以在不同的进程中托管对桌面的控制。如果桌面上有一个静态映像,则只有一个进程。如果您有多个图像,并且Windows不时更改背景图像,那么您还有另一个过程。我花了一些时间才找到一个通用算法,它应该在这里处理桌面控制。

设置图标的位置

如前所述,图标只是显示在控件中的项目。很容易获得这些项目的总数:ListView

C#
var numberOfIcons = (int)Win32.SendMessage(_desktopHandle, Win32.LVM_GETITEMCOUNT, IntPtr.Zero, IntPtr.Zero);

将图标的位置设置到某个点也很容易:(x,y)

C#
public static IntPtr MakeLParam(int wLow, int wHigh)
{return (IntPtr)(((short)wHigh << 16) | (wLow & 0xffff));
}...Win32.SendMessage(_desktopHandle, Win32.LVM_SETITEMPOSITION, iconIndex, MakeLParam(x, y));

其中 是 和 之间的图标的索引。iconIndex 0numberOfIcons - 1

所以接下来要做的就是获得图标位置。这是另一个等待我的问题。

获取图标的位置

看起来很容易获得图标的位置。你只需这样称呼:

C#
Win32.SendMessage(_desktopHandle, Win32.LVM_GETITEMPOSITION, iconIndex, pointerToResult);

和变量包含指向一个简单结构的指针,该结构描述了带有索引的图标的位置。但它不起作用。问题是,我们向其发送消息的控制处于另一个进程中。因此,该变量指向另一个进程中的内存。由于内存保护,我们无法访问它。因此,算法变得更加复杂。我从这里拿走了它。很快,您必须首先分配共享内存,然后发送命令将一些信息写入此共享内存,然后从那里读取所需的信息。pointerToResult iconIndexpointerToResult

现在,我有能力获取和设置图标的位置。我写了一个简单的程序来保存和恢复这些位置。但似乎这不是结束。

获取图标文本

很快,在我开始使用我的程序后,我意识到它可能会交换图标。我的Microsoft Word图标已在回收站等位置恢复。这意味着在重新启动Microsoft Word图标的索引被更改后,我不能只依赖索引。我开始思考我可以使用什么作为常量值来区分图标。显而易见的答案是:"他们的文本"。但这个简单的任务变成了一场噩梦。互联网上有很多示例,您可以使用相同的机制在桌面上获取图标文本。没有人在我的笔记本电脑上工作。最后,我遇到了这段使用汇编来解决此任务的代码。它允许我获取图标的文本,并将它们与图标索引连接起来。我存储了带有位置的文本,并使用图标的索引在当前计算机负载上具有相同的文本来恢复位置。SendMessageUIAutomationClient

最后一件

现在我能够享受我的程序。它成功保存并恢复了图标的位置。但很快,我注意到了另一个问题。加载笔记本电脑后,我恢复了图标的位置。他们被安置得很好。但是当我启动几个应用程序时,所有图标突然又搞砸了。我开始调查这个问题,发现我需要刷新桌面以保留图标位置。幸运的是,这很容易做到:

C#
[System.Runtime.InteropServices.DllImport("Shell32.dll")]
private static extern int SHChangeNotify(int eventId, int flags, IntPtr item1, IntPtr item2);...SHChangeNotify(0x8000000, 0x1000, IntPtr.Zero, IntPtr.Zero);

但很快,很明显,这段代码有一个副作用。它还经常排列图标。这并不完全是"刷新"命令对桌面的作用。我开始寻找如何进行真正的刷新。而且我没有在我的笔记本电脑上找到任何工作。一段时间后,我突然意识到Windows中有一个快捷方式"F5"可以刷新桌面,我只需要将此密钥发送到桌面即可。代码相当简单:

C#
PostMessage(_desktopHandle, WM_KEYDOWN, VK_F5, 0);

其中 类似于 。现在一切似乎都很好。PostMessage SendMessage

兴趣点

如果有一种方法可以使用以下方法获取图标文本,对我来说仍然很有趣:SendMessage

C#
Win32.SendMessage(_desktopHandle, Win32.LVM_GETITEMTEXT, iconIndex, ...);

一定有办法...

附言

我知道文章中没有太多代码。但毕竟,我没有创建很多代码。其中大部分取自不同的来源。我只是想展示解决保存和恢复图标位置的陷阱。如果您需要代码,只需下载我的完整项目(请参阅文章顶部的链接)。或者按照文本中的链接转到我的信息来源。

保存和恢复桌面上的图标位置相关推荐

  1. 在 Windows 10 中保存和恢复桌面图标位置的 2 个免费工具

    https://www.intowindows.com/free-tools-to-save-restore-desktop-icon-positions-in-windows-10/ 所有 PC 用 ...

  2. 如何在计算机桌面恢复我的电脑,桌面上我的电脑图标不见了怎么恢复?桌面计算机图标不见了的3个解决方法...

    最近有位朋友,使用Windows系统的时候,发现电脑桌面我的电脑图标不见了,不知道怎么回事.其实,遇到桌面我的电脑或计算机图标不见了的情况,我们应该怎么办呢?下面就和小编来看一下桌面上我的电脑图标不见 ...

  3. 联想笔记本桌面计算机不见了,桌面上的图标不见了怎么办,教您桌面上的图标不见了怎么办...

    小伙伴们,你们知道怎么解决桌面上的图标不见了的问题吗?小编我这儿呢有解决的方法,但是就是不知道小伙伴们感不感兴趣呢,如果感兴趣的小伙伴们就现在滑动起你们手上的鼠标,和小编一起往下看看吧~ 小伙伴们,我 ...

  4. 重启计算机后桌面顺序是反的,Win10系统为什么重启电脑之后桌面上的图标排列顺序被打乱该如何处理...

    导语:许多盆友发觉在应用Win10系统时,重新启动以后桌面图标越来越错乱,针对桌面图标不多的盆友而言还行,如果多的客户那简直十分烦闷的事儿,下面白豆芽就和大家分享Win10系统为什么重启电脑之后桌面上 ...

  5. w8电脑桌面计算机不见了,w8桌面上我的电脑图标不见了怎么办

    有时候恶意软件通过修改注册表键值让w8桌面上我的电脑图标,回收站,等常用图标消失.那么如何如何找回消失的图标呢?小编给你支个招. w8桌面上我的电脑图标不见了的原因及解决方法 w8桌面上我的电脑图标不 ...

  6. w7系统桌面没有计算机图标不见了,win7桌面上我的电脑图标不见了怎么办

    在安装软件的时候,为了方便快速启动这些软件,一般都会在桌面上创建图标.可是最近有用户发现,自己在使用win7系统电脑时,发现桌面上我的电脑图标不见了,每次想打开我的电脑都得从其它地方打开,很是麻烦.对 ...

  7. w7系统桌面没有计算机图标不见了,桌面上我的电脑图标不见了怎么办

    摘要:无论是XP还是win7系统都会出现我的电脑图标没了这种情况,那么遇到我的电脑图标不见了我们应该怎么办呢?小编为大家带来XP.win7win7我的电脑图标没了的解决方法. 使用其他软件电脑重装后, ...

  8. windows7桌面找不到计算机名,win7系统桌面上的图标没有文件名如何解决?

    相信大家大部分用户都遇到过一件事情就是win7系统桌面上的图标没有文件名,电脑开机后桌面上的图标没有文件名,只剩下一个图标,也不知道怎么回事?如何解决?经过小编研究后终于找到解决方法了.下面分享win ...

  9. 为什么计算机桌面图标不见了,桌面上的图标不见了怎么办(电脑桌面图标突然没了怎么办?简单三步教你解决)...

    使用电脑过程中,我们有时候会发现桌面上的图标不见了,或者我们不小心误删了,这时候我们又急着是用电脑,怎么办呢?在这里网际简单三步教你解决!以win10系统来教大家怎么找回我的桌面电脑图标如下简单3步: ...

最新文章

  1. 从零到一:带你认识深度学习!
  2. UWP 负载包含两个或多个具有相同目标的路径 'xxx'
  3. ruby应用:puppet
  4. Android开发之自定义Notification(源代码分享)
  5. python如何解决高并发_Flask 处理高并发、多线程
  6. matlab中统计数组中各数字(元素)出现的次数
  7. 刷新页面,无论点击多少次让Element UI的Message消息提示弹出一个
  8. c# 微服务学习_资深架构师学习笔记:什么是微服务?
  9. 并发编程 07—— 任务取消
  10. 听说C站还有人缺图片素材?一篇跟UI设计师要来的——图片网址整理大全 让你从此远离素材荒!(强烈建议收藏)
  11. 计算机命令提示符的使用,命令提示符(电脑系统命令提示符的打开方法)
  12. kux格式怎么转换成mp3_kux格式怎么转换?kux完美转换成MP3音频的技巧分享
  13. jquery实现侧边栏手风琴三级导航菜单demo
  14. 射频功放学习之基础篇(一)
  15. 照片视频制作软件哪个好?自动生成酷炫效果,3步快速搞定!
  16. on duplicate mysql_mysql 避免重复写入数据的三种方式 和insert ...on duplicate updt... 死锁...
  17. 毕业设计 STM32单片机的智能公路收费站系统 - 物联网
  18. android 临时文件存储,缓存和临时文件/文件夹删除android
  19. 为什么毕业后五年,你们的贫富差距越拉越大
  20. 软件工程使用的编程语言

热门文章

  1. PowerShell命令之AD域控
  2. 17届智能车竞赛技术报告 | 北京科技大学无线充电组
  3. Vertx入门学习(含代码)
  4. XTU—1190 Game of Wuxing
  5. CAD图纸能转换成图片吗
  6. GeoIP获取IP的所在地区
  7. chatGPT接入微信攻略
  8. 服务器获取客户端电脑文件,服务器获取客户端文件
  9. 登录服务器客户端密码修改,客户端服务器登录密码问题
  10. C# string ASCII码 16进制转换