一位高手说只要修改注册表键值就可以去掉Home界面上的Recent Programs图标:
[HKEY_CURRENT_USER/System/State/Shell]
"Start MRU"
我试了一下,果然可以,特发帖share一下。
e.g. 我想删除短信图标,代码如下:
RemoveRecentPrograms(_T("//Windows//Start Menu//Messaging.lnk"));
- BOOL RemoveRecentPrograms(TCHAR *szLnkPath)
- {
- BOOL bRet = FALSE;
- HKEY hKey = NULL;
- BYTE *pData = NULL;
- BYTE *pDataNew = NULL;
- BYTE *pIndex = NULL;
- DWORD dwType;
- DWORD cbData;
- int iLnkCount = 0;
- int iCurLen = 0;
- if(ERROR_SUCCESS != RegOpenKeyEx(HKEY_CURRENT_USER, _T("System//State//Shell"), 0, 0,&hKey))
- {
- goto Exit;
- }
- if(ERROR_SUCCESS != RegQueryValueEx(hKey, _T("Start MRU"), NULL, &dwType, NULL, &cbData))
- {
- goto Exit;
- }
- pData = new BYTE[cbData];
- if (!pData)
- {
- goto Exit;
- }
- if(ERROR_SUCCESS != RegQueryValueEx(hKey, _T("Start MRU"), NULL, &dwType, pData, &cbData))
- {
- goto Exit;
- }
- iLnkCount = pData[0];
- pIndex = pData + 4;
- iCurLen = 4;
- for (int i = 0; i < iLnkCount; i++)
- {
- int iLnkLen = pIndex[0];
- if (!_tcscmp(szLnkPath, (TCHAR *)(pIndex + 12)))
- {
- pDataNew = new BYTE[cbData - iLnkLen];
- if (!pDataNew)
- {
- goto Exit;
- }
- memcpy(pDataNew, pData, iCurLen);
- if (iCurLen + iLnkLen < cbData)
- {
- memcpy(pDataNew + iCurLen, pData + iCurLen + iLnkLen, cbData - iCurLen - iLnkLen);
- }
- pDataNew[0]--;
- if (ERROR_SUCCESS != RegSetValueEx(hKey, _T("Start MRU"), 0, dwType, pDataNew, cbData - iLnkLen))
- {
- goto Exit;
- }
- bRet = TRUE;
- break;
- }
- pIndex += iLnkLen;
- iCurLen +=iLnkLen;
- }
- Exit:
- if (pData)
- {
- delete [] pData;
- }
- (pDataNew)
- {
- delete [] pDataNew;
- }
- if (hKey)
-
- {
- RegCloseKey(hKey);
- }
- return bRet;
- }
引用一下bearbrotherji的研究成果:
1.开始四个BYTE,比如0A 00 00 00,
第一个BYTE为当前最近使用过的快捷方式的个数,也就是在主界面里显示的个数。这个通常在用过一段时间以后都是0xA(十个);
2.这四个Byte之后,则是所有快捷方式,我们只举例说明其中一个,比如:
0x50, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x5C, 0x00, 0x57, 0x00,
0x69, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00,
0x77, 0x00, 0x73, 0x00, 0x5C, 0x00, 0x53, 0x00,
0x74, 0x00, 0x61, 0x00, 0x72, 0x00, 0x74, 0x00,
0x20, 0x00, 0x4D, 0x00, 0x65, 0x00, 0x6E, 0x00,
0x75, 0x00, 0x5C, 0x00, 0x53, 0x00, 0x69, 0x00,
0x6D, 0x00, 0x54, 0x00, 0x6B, 0x00, 0x55, 0x00,
0x49, 0x00, 0x2E, 0x00, 0x6C, 0x00, 0x6E, 0x00,
0x6B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
每个快捷方式的开头都是4个Bytes,然后紧跟着8个Bytes的“0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF”,这4个Bytes的第一个字符会有所变化,但目前我并不清楚他的含义,不过这并不影响处理;
再之后就是快捷方式文件的路径和文件名对应的字符串,
最后一定有一个以4bytes地址对齐的4Bytes全0数据,以表示这个快捷方式的结束;
如果你要实现如你所说的功能,将最近使用过的某个快捷方式图标从主界面上删除,
首先将第一个Byte的值减小1,
接着,在整个字符串中找到你要删除的快捷方式对应的完整字符串,并将这一段删除,而保留其余的(记住不要把之后的字符串也给删除了,要连上之前的,再写回);
我的补充:
每个快捷方式的开头都是4个Bytes,表示这个lnk的长度,包括开头的4个字节、“0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF”这8个字节和lnk的字符串长度(包括填充的0x00字节)。