现在项目中有这样一个需求:根据不同情况,控制特定图标显示/隐藏。对应普通图标来说,还是比较容易实现的。但是系统图标,是打开虚拟目录,没有打开目标程序,也没有具体的文件目录(因为是虚拟目标),所以新创建一个系统图标不太现实。我在网上找了一段时间,也没有找到相关解决方案。后来经同事提醒,可以尝试通过修改注册表的方式来实现类似功能。于是,开始尝试修改注册表配置,果然可以!!! 下面粘贴出代码,需要的童鞋直接拿去吧!
// 系统图标key定义
// 此电脑
char MyComputer[MAX_PATH] = "{20D04FE0-3AEA-1069-A2D8-08002B30309D}";
// 控制面板
char ControlPanel[MAX_PATH] = "{5399E694-6CE5-4D6C-8FCE-1D8870FDCBA0}";
// 用户文件
char UserFile[MAX_PATH] = "{59031a47-3f72-44a7-89c5-5595fe6b30ee}";
// 回收站
char RecycleBin[MAX_PATH] = "{645FF040-5081-101B-9F08-00AA002F954E}";
// 网络
char Network[MAX_PATH] = "{F02C1A0D-BE21-4350-88B0-7367FC96EF3C}";
// 刷新间隔
DWORD FreshSpace = 1000;
// 写注册表
// key:注册表键
// value:注册表值
void WriteRegedit(char* key,int value)
{
HKEY hKey;//定义有关的hKEY,在查询结束时要关闭
HKEY hTempKey;
DWORD dwSize = sizeof(DWORD);
//打开与路径data_Set相关的hKEY
LPCTSTR data_Set = _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\HideDesktopIcons");
LSTATUS openStatus = ::RegOpenKeyEx(HKEY_CURRENT_USER, data_Set, 0, KEY_WOW64_64KEY | KEY_READ, &hKey);
if (ERROR_SUCCESS == openStatus)
{
// 使用hKey来操作data_Set这个KEY里面的值。
if (ERROR_SUCCESS == ::RegCreateKey(hKey, "NewStartPanel", &hTempKey))
{
LSTATUS setStatus = ::RegSetValueEx(hTempKey, key, 0, REG_DWORD, (const BYTE*)& value, sizeof(DWORD));
if (ERROR_SUCCESS != setStatus)
{
::RegCloseKey(hKey);
return;
}
}
}
::RegCloseKey(hKey);
}
// 显示"此电脑"
void ShowMyComputer(int bShow)
{
WriteRegedit(MyComputer, bShow);
FreshDesktop();
}
// 显示"控制面板"
void ShowControlPanel(int bShow)
{
WriteRegedit(ControlPanel, bShow);
FreshDesktop();
}
// 显示"用户文件"
void ShowUserFile(int bShow)
{
WriteRegedit(UserFile, bShow);
FreshDesktop();
}
// 显示"回收站"
void ShowRecycleBin(int bShow)
{
WriteRegedit(RecycleBin, bShow);
FreshDesktop();
}
// 显示"网络"
void ShowNetwork(int bShow)
{
WriteRegedit(Network, bShow);
FreshDesktop();
}
// 刷新桌面(重绘桌面)
void FreshDesktop(int bShow)
{
::Sleep(FreshSpace);
::SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST | SHCNF_FLUSH, NULL, NULL);
}
上面的代码经过测试,完全可以自由控制系统的显示/隐藏。
注意:一定要调用FreshDesktop()重新绘制桌面。