从windows startmenu快速启动中删除exe

时间:2011-02-17 04:39:30

标签: c++ windows winapi startmenu

对于工作,我们有两个安装到开始菜单的快捷方式,它们都指向同一个exe(但第二个具有不同的命令行参数)。

有时候,Windows会选择第二个快捷方式显示在开始菜单热门程序列表中,这是不好的,因为它会导致应用程序的完全更新。

有没有办法告诉Windows不要在开始菜单列表中显示该快捷方式?

2 个答案:

答案 0 :(得分:4)

是的,事实上Raymond Chen just wrote about this

  

您可以将System.App­User­Model.Exclude­From­Show­In­New­Install property设置为VARIANT_TRUE以告诉“开始”菜单,“我不是该程序的主要入口点;我是辅助快捷方式,如帮助文件。”< / p>

示例代码(CCoInitialize class):

#include <windows.h>
#include <tchar.h>
#include <shlobj.h>
#include <atlbase.h>

// class 3CCoInitialize incorporated here by reference

int __cdecl _tmain(int argc, TCHAR **argv)
{
 // error checking elided for expository purposes
 CCoInitialize init;
 CComPtr<IShellLink> spsl;
 spsl.CoCreateInstance(CLSID_ShellLink);
 spsl->SetPath(TEXT("C:\\Program Files\\LitWare\\LWUpdate.exe"));
 PROPVARIANT pvar;
 pvar.vt = VT_BOOL;
 pvar.boolVal = VARIANT_TRUE;
 CComQIPtr<IPropertyStore>(spsl)->SetValue(PKEY_AppUserModel_ExcludeFromShowInNewInstall, pvar);
 CComQIPtr<IPersistFile>(spsl)->Save(L"LitWare Update.lnk", TRUE);
 return 0;
}

答案 1 :(得分:2)

您可以在此处找到这些设置的文档:Application User Model IDs (AppUserModelIDs)。具体来说,您正在寻找名为“任务栏固定和最近/常用列表的排除列表”的部分。适用部分转载如下:

  

应用程序,进程和窗口可以选择使其自身不可用于固定到任务栏或包含在“开始”菜单的MFU列表中。有三种机制可以实现这一目标:

     
      
  1. NoStartPage条目添加到应用程序的注册中,如下所示:

    HKEY_CLASSES_ROOT\Applications\Example.exe\NoStartPage
    
         

    忽略与NoStartPage条目关联的数据。只需要存在条目。因此,NoStartPage的理想类型为REG_NONE

         

    请注意,使用显式AppUserModelID会覆盖NoStartPage条目。如果将明确的AppUserModelID应用于快捷方式,进程或窗口,它将变为pinnable并且符合“开始”菜单MFU列表的条件。

  2.   
  3. 在Windows和快捷方式上设置System.AppUserModel.PreventPinning属性。必须在PKEY_AppUserModel_ID属性之前的窗口上设置此属性。

  4.   
  5. 在以下注册表子项下添加显式AppUserModelID作为值,如下所示:

    HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\FileAssociation\NoStartPageAppUserModelIDs\AppUserModelID
    
  6.         

    每个条目都是REG_NULL值,其名称为AppUserModelID。此列表中找到的任何AppUserModelID都不可以固定,也不符合包含在“开始”菜单MFU列表中的条件。