程序组上下文菜单项缺少

时间:2018-03-05 20:55:39

标签: vb.net windows-installer

我有一个带有安装/安装程序项目的Visual Studio 2013 Windows窗体解决方案(VB.NET 4.5和Windows Installer 4.5)。

我让安装程序添加了一个Start Program文件夹和项目,即"开始/所有程序/我的公司/应用程序名称"。

除了上下文菜单没有显示我期望看到的几个项目之外,安装程序的工作方式与广告一样。

这是"正常"程序项目上下文菜单(对于Skype,比如说)在左边,而我的应用程序在右边:

Context menu comparison

请注意缺少"以管理员身份运行","打开文件位置","固定到开始菜单"等

我进一步观察,如果我比较每个节目菜单项的属性,我看到Skype的目标是明确的" .exe"虽然我自己的目标是整个计划组(左边是Skype,右边是我的应用程序):

Properties comparison

另请注意,我无法编辑目标

现在,如果我手动添加我的应用程序" .exe"对于程序组,属性和上下文菜单显示与Skype相同:

Exe Properties and context

然后我检查了安装程序项目的文件系统设置中的Windows Installer快捷方式设置。据我所知,它只允许我创建解决方案主要输出的快捷方式,而且我无法明确地快捷键入KeyOutput" .exe"。

任何人都可以对此有所了解吗?我错过了一些明显的东西吗?

更新:为了澄清我需要的内容,我希望安装程序根据Skype示例创建一个程序菜单项快捷方式,其中包含所有相同的上下文菜单选项。

更新:在使用Orca进行Stein建议的MSI更改后,验证失败并出现一些错误:

ICE43 ERROR Component 'C__667B7EAE74690565610625BA20DE4CEE' has non-advertised shortcuts. It should use a registry key under HKCU as its KeyPath, not a file. ICE57 ERROR Component 'C__667B7EAE74690565610625BA20DE4CEE' has both per-user and per-machine data with a per-machine KeyPath.

(还有一个与手动更改无关的警告:

ICE90 WARNING The shortcut '_2B5AE78F623048DC8EDAB2174FC1AB82' has a directory that is a public property (ALL CAPS) and is under user profile directory. This results in a problem if the value of the ALLUSERS property changes in the UI sequence.

这可以通过进一步手动更改密钥来解决,例如包括小写,例如_2b5AE78 ...)

不幸的是,我发现在经常使用修改后的MSI时,程序组根本没有实际创建。最初,它似乎工作,但此后,不是。所以我已经恢复了未经修改的MSI,只是搞了上下文问题,因为它真的不值得痛苦。

1 个答案:

答案 0 :(得分:3)

您所描述的是广告的快捷方式标准快捷方式a lot of info on MSI shortcuts)。广告的快捷方式是Windows Installer功能 - 它们在实际上指向产品功能(MSI包中的功能)的意义上是唯一的,而不是直接指向文件。因此,我认为它们的设置是为了处理快捷方式文件(*.lnk files)而设置不同。

从广义上讲:广告快捷方式是MSI“按需安装”功能的核心,并且还会在调用时触发MSI密钥路径检查(安装完整性检查) - 这可以触发自我如果未正确安装相关产品,请进行维修。

*.lnk files的shell处理定义在:HKEY_CLASSES_ROOT\.lnk\

按住 SHIFT ,然后右键单击广告的快捷方式会带来更多选项 - 例如run as administrator。我认为shell本身(%SystemRoot%\system32\shell32.dll)处理*.lnk files

我们无法从您提供的说明中真正说明您的需求。也许您只需要run as administrator选项?也许不是,但如果你这样做,我想有几个选择:

  1. 只需使用常规快捷方式(将 WiX项目Shortcut element广告属性设置为““)。这应该会在安装后为快捷方式显示“正常”上下文菜单。

  2. 依靠上面描述的 SHIFT + 右键单击鼠标,在需要时显示run as administrator - 如果这就是您所追求的。

    • 这实际上显示了通常隐藏的菜单项,并在注册表本身中标记为“扩展”,或者在编译的shell扩展处理程序的代码库中标记为这样。
    • 您可以添加自己的shell扩展菜单,只需触发命令行 - 无需编译的shell扩展处理程序。您甚至可以添加子菜单(级联)并将它们设置为仅在 SHIFT + 右键单击(以及其他各种选项)上显示。一个题外话,但只是想提一下。
  3. 如果您始终需要管理员权限,我想您可以通过应用程序清单要求管理员权限?通常这些天非常不满意,但可能:How do I force my .NET application to run as administrator?

    • 此提升适用于管理员,但不适用于普通用户(非管理员用户) - 他们无法提升为管理员权限。
    • 普通用户需要输入管理员凭据(对于管理员帐户)才能以管理员权限运行。
  4. 要对已编译的MSI进行后处理以禁用播发的快捷方式:

    1. 使用Orca(or another capable tool)打开MSI。
    2. 在File表中,从第一列获取文件ID。例如_55E33B8404377A30ACD2C521F357BF91
    3. 在快捷方式表中,将目标字段设置为:[!_ 55E33B8404377A30ACD2C521F357BF91]。
    4. 保存并测试安装。