如何删除SP Home界面的Recent Programs图标

一位高手说只要修改注册表键值就可以去掉Home界面上的Recent Programs图标:

[HKEY_CURRENT_USER/System/State/Shell]

"Start MRU"

我试了一下,果然可以,特发帖share一下。

 

e.g. 我想删除短信图标,代码如下:

RemoveRecentPrograms(_T("//Windows//Start Menu//Messaging.lnk"));

  1. BOOL RemoveRecentPrograms(TCHAR *szLnkPath)
  2. {
  3.     BOOL bRet = FALSE;
  4.     HKEY hKey = NULL;
  5.     BYTE *pData = NULL;
  6.     BYTE *pDataNew = NULL;
  7.     BYTE *pIndex = NULL;
  8.     DWORD dwType;
  9.     DWORD cbData;
  10.     int iLnkCount = 0;
  11.     int iCurLen = 0;
  12.     if(ERROR_SUCCESS != RegOpenKeyEx(HKEY_CURRENT_USER, _T("System//State//Shell"), 0, 0,&hKey))
  13.     {
  14.         goto Exit;
  15.     }
  16.     if(ERROR_SUCCESS != RegQueryValueEx(hKey, _T("Start MRU"), NULL, &dwType, NULL, &cbData))
  17.     {
  18.         goto Exit;
  19.     }
  20.     pData = new BYTE[cbData];
  21.     if (!pData)
  22.     {
  23.         goto Exit;
  24.     }
  25.     if(ERROR_SUCCESS != RegQueryValueEx(hKey, _T("Start MRU"), NULL, &dwType, pData, &cbData))
  26.     {
  27.         goto Exit;
  28.     }
  29.     iLnkCount = pData[0];
  30.     pIndex = pData + 4;
  31.     iCurLen = 4;
  32.     for (int i = 0; i < iLnkCount; i++)
  33.     {
  34.         int iLnkLen = pIndex[0];
  35.         if (!_tcscmp(szLnkPath, (TCHAR *)(pIndex + 12)))
  36.         {
  37.             pDataNew = new BYTE[cbData - iLnkLen];
  38.             if (!pDataNew)
  39.             {
  40.                 goto Exit;
  41.             }
  42.             memcpy(pDataNew, pData, iCurLen);
  43.             if (iCurLen + iLnkLen < cbData)
  44.             {
  45.                 memcpy(pDataNew + iCurLen, pData + iCurLen + iLnkLen, cbData - iCurLen - iLnkLen);
  46.             }
  47.             
  48.             pDataNew[0]--;
  49.             if (ERROR_SUCCESS != RegSetValueEx(hKey, _T("Start MRU"), 0, dwType, pDataNew, cbData - iLnkLen))
  50.             {
  51.                 goto Exit;
  52.             }
  53.             bRet = TRUE;
  54.             break;
  55.         }
  56.         pIndex += iLnkLen;
  57.         iCurLen +=iLnkLen;
  58.     }
  59. Exit:
  60.     if (pData)
  61.     {
  62.         delete [] pData;
  63.     }
  64.      (pDataNew)
  65.     {
  66.         delete [] pDataNew;
  67.     }
  68.     
  69.     if (hKey)
    •     {
    •         RegCloseKey(hKey);
    •     }
  70.     return bRet;
  71. }

引用一下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字节)。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值