问题:

项目原有的一套结构由于引进了一个磁盘套件,类似于关闭系统的explorer.exe进程,进入到他所维护的explorer.exe中。于是出现了当退出磁盘的时候没有保存好桌面布局信息导致下次进入的时候磁盘中的桌面信息又变成初始化的状态了。

这里分析后问题所在就是没有提供自动保存桌面信息的机制,所以磁盘退出的时候没有将说面事实状态信息保存到注册表。

解决过程:

查阅资料知道,Windows将桌面布局信息都在注册表\HKEY_CURRENT_USER\SoftWare\Microsoft\Windows\Shell\Bags\1\Desktop下,每次explorer.exe启动的时候会去读这个注册表以初始化桌面布局信息。在explorer.exe运行过程中有若干中方式去触发保存桌面布局信息到这个注册表下。最简单的一种方式就是按F5刷新(当然右键菜单刷新也一样)。

因此可以考虑模拟向explorer.exe发送F5消息来刷新桌面,确保注册表中保存了磁盘退出时桌面的事实状态就可以了。

不过要注意的时,程序中实现桌面刷新要避免桌面闪烁,我这里是通过发送F5前先禁止桌面重绘,发完后再恢复的方式,但是由于WM_KEYDOWN消息只有通过post发送才有效,用send方式发送无效,所以如果立刻启用重绘仍然会刷新,于是尝试在这之前Sleep一小段时间,发现能达到桌面不闪烁的效果了。基本就满足需求了。

代码片段如下:

// 桌面窗口名
HWND lhWndProgman = ::FindWindow(L"Progman", NULL);
if(NULL == lhWndProgman)
break;
::PostMessage(lhWndProgman, WM_SETREDRAW, 0, 0);
HWND lhWndListView = ::FindWindowEx(FindWindowEx(lhWndProgman, NULL, L"SHELLDLL_DefView", NULL), NULL, L"SysListView32", NULL);
::PostMessage(lhWndListView, WM_KEYDOWN, VK_F5, 0);
Sleep(100);
::PostMessage(lhWndProgman, WM_SETREDRAW, 1, 0);

windows 触发桌面图标布局保存的更多相关文章

  1. Win10桌面图标显示不正常变成了白色

    开机不知道什么原因,windows 10 桌面图标全部变成了白色,软件是可以点击正常打开使用,但是看着特别不爽.今天就告诉大家一种办法,解决这种问题. 解决步骤 1.在桌面右键新建 "文本文 ...

  2. Windows 10设置桌面图标间距、窗口的背景颜色、选中文字的背景颜色

    Windows 10取消了“高级外观设置”(或者叫“窗口颜色和外观”设置),想调整一些参数只能进注册表了. 修改后可能需要注销或重启才能生效. 按Win+R,然后输入regedit进入注册表编辑器. ...

  3. Windows XP解决显示桌面图标消失的问题

    1.依次单击“开始”,“运行”,在运行对话框中输入regsvr32 /n /i:u shell32.dll,按回车键 2.弹出“shell32.dll中的DllInstall成功”的窗口,表明已将数据 ...

  4. Windows ->> Windows Server 2012打开管理添加“我的电脑”桌面图标途径

    Windows Server 2012打开管理添加“我的电脑”桌面图标途径 rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0

  5. Windows Server 2012 修改桌面图标

    在virtualbox 4.2.18中装了个Windows Server 2012 来体验下,结果发现桌面图标都不知道在哪改.在百度文库上找到了解决方法:http://wenku.baidu.com/ ...

  6. Windows 7桌面显示图标窗口句柄的获取

    在windows XP时代,我们获取桌面图标窗口的句柄往往用一下语句: HWND hwndParent = ::FindWindow( "Progman", "Progr ...

  7. 【转载】如何删除Windows远程桌面保存的账号密码数据

    在Windows系统中,无论是win7.win8还是win10系统,都可使用Windows系统自带的远程桌面连接工具来远程服务器,很多时候Windows远程桌面在连接一次后会自动保存连接的账号密码等信 ...

  8. 如何在Windows Server 2008 R2中更改桌面图标

    如何在Windows Server 2008 R2中更改桌面图标 Windows Server 2008 R2 已经在 MSDN 和 TechNet Plus 订阅上公布,gOxiA 在第一时间下载并 ...

  9. Windows桌面图标不见了,可能是结束了explorer.exe进程导致

    Windows桌面图标不见了,怎么办?那么可能是你关掉了explorer.exe的进程. 解决办法: ① Ctrl+shift+delete打开任务管理器,查看进程是否有explorer.exe ② ...

随机推荐

  1. Java 编程的动态性 第1 部分: 类和类装入--转载

    原文地址:http://www.ibm.com/developerworks/cn/java/j-dyn0429/ 本文是这个新系列文章的第一篇,该系列文章将讨论我称之为 Java 编程的动态性的一系 ...

  2. 一个简单的Verilog计数器模型

    一个简单的Verilog计数器模型 功能说明: 向上计数 向下计数 预装载值 一.代码 1.counter代码(counter.v) module counter( input clk, input ...

  3. Wcf资料收集

    1.简介 http://www.tuicool.com/articles/mqYB32 使用规范 http://blog.51cto.com/zt/219 2.教程系列 http://www.cnbl ...

  4. Arcgis Android 基本概念 - 浅谈

    MapView     MapView 是 Android 中 ViewGroup的子类,也是 ArcGIS Runtime SDK for Android 中的地图容器,与很多 ArcGIS API ...

  5. Linux 所有命令都用不了,只有cd exit能用

    原因: 在设置 java环境变量时,编辑profile文件没有写正确,导致在命令行下 ls等命令不能够识别.在命令行下打入下面这段就可以了export PATH=/usr/local/sbin:/us ...

  6. 经典shell面试题整理

    一.取出/etc/passwd文件中shell出现的次数 问题:下面是一个/etc/passwd文件的部分内容.题目要求取出shell并统计次数,shell是指后面的/bin/bash,/sbin/n ...

  7. Linux && vim 批量替换

    Linux批量文件的字符串替换 sed -i "s/oldstring/newstring/g" `grep oldstring -rl path` vim多行替换::1,2s/s ...

  8. Objective-C学习篇09—NSNumber与笑笑语法

    NSNumber 由于数组,字典,集这三个容器中只能存放对象类型的数据,如果想把基本数据类型的数据存放到这三个容器中,需要把基本数据类型转化为对象类型,此时就要借助于NSNumber 这个类. NSN ...

  9. JAVA-2-DATA

    import java.util.*; public class Ch0310 { public static void main(String[] args) { // TODO 自动生成的方法存根 ...

  10. 你好,C++(22) 排排坐,吃果果——4.3.3 for循环:某个范围内…每个都…

    4.3.3  for循环:某个范围内…每个都… 既然while语句和do…while…语句都已经可以满足我们表达循环现象的需要,那为什么C++还要专门提供for语句来表达循环现象呢?在现实世界中,常常 ...