來自:http://blog.csdn.net/zxjl0214/archive/2008/10/10/3051928.aspx
一位高手說只要修改註冊表索引值就可以去掉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位元組)。