繁体   English   中英

如何在开始菜单中将我自己的应用程序置于顶部?

[英]How can I make my own application on top in the start menu?

我用C#语言(.net)编写了一个小型桌面应用程序(主窗体)。 我希望将我的应用程序放在开始菜单(Windows 8)的顶部,就像“camtasia studio screenrecoder”一样。

看截图我想要的小应用程序。

在此输入图像描述

我必须在我的应用程序中添加什么代码?

注意:我尝试设置topMost = true ,但这不起作用。

如果您想要一个位于Metro顶部的窗口,则需要它来声明可访问性。 以下是要点:

  1. 应用程序必须要求uiAccess(app.manifest)

  2. 应用程序必须断言“最顶层”窗口定位(在Win32 / SetWindowPos或WinForms / WPF的“Topmost”属性中,以编程方式或其他方式)

  3. 如果不更改组策略设置,则必须将其安装到某个受信任位置[C:\\ Windows,C:\\ Program Files,C:\\ Program Files(x86)]。

一个。 注意:如果您希望能够从任意位置运行它,则必须禁用安全设置:“用户帐户控制:仅提升安装在安全位置的UIAccess应用程序”。

注意2:这与将HKLM \\ Software \\ Microsoft \\ Windows \\ CurrentVersion \\ Policies \\ System \\ ValidateAdminCodeSignatures设置为0相同

  1. 所述应用程序无法在调试器中运行

  2. 如果它是.NET应用程序

一个。 清单必须嵌入在构建后的步骤中

应用程序必须具有“延迟签名”(意味着它不能从内置调试器运行,尽管您可以构建和附加 - 这是Microsoft所做的)

  1. 必须使用受信任的证书对应用程序进行签名。

  2. 必须将所述可信证书安装到受信任的根证书颁发机构(这很重要!它不能只是简单地安装)

有关详细信息,请参阅: http//msdn.microsoft.com/en-us/library/ms726294

为了强制您的应用程序高于Metro的用户界面,您需要执行以下操作:

  1. 创建一个Win32项目
  2. 完成向导而不做任何更改。
  3. 更改CreateWindowEXset WS_EX_TOPMOST
  4. 转到Project.Properties并链接到清单文件。
  5. 更改UAC以绕过UI保护; 应该是/uiAccess = "true"
  6. 建立你的项目。
  7. 使用SignTool对应用程序进行签名。
  8. 确保应用程序存储在Program FilesProgram Files (x86)
  9. 运行您的应用程序
  10. 加载“ Start Menu ,您的应用程序应在Metro上方运行。

您的清单应如下所示:

<trustInfo xmlns="urn:0073chemas-microsoft-com:asm.v3">
    <security>
        <requestedPrivileges>
        <requestedExecutionLevel
            level="highestAvailable"
            UIAccess="true" />
        </requestedPrivileges>
    </security>
</trustInfo>

默认情况下,如果省略该属性,或者程序集不存在清单,则将其设置为false 如果false您将无法访问ProtectedUI

有关安全性的更多信息,请访问

这是一个可以工作或允许修改以测试UAC的脚本:

class Elevated_Rights
{

    // Token Bool:
    private bool _level = false;

    #region Constructor:

    protected Elevated_Rights()
    {
         // Invoke Method On Creation:
         Elevate();
     }

     #endregion

     public void Elevate()
     {
         // Get Identity:
         WindowsIdentity user = WindowsIdentity.GetCurrent();

         // Set Principal
         WindowsPrincipal role = new WindowsPrincipal(user);

         #region Test Operating System for UAC:

         if (Environment.OSVersion.Platform != PlatformID.Win32NT || Environment.OSVersion.Version.Major < 6)
         {
              // False:
              _level = false;
         }
         #endregion

         else
         {
              #region Test Identity Not Null:

              if (user == null)
              {
                    // False:
                    _level = false;
              }
              #endregion

              else
              {
                    #region Ensure Security Role:

                    if (!(role.IsInRole(WindowsBuiltInRole.Administrator)))
                    {
                        // False:
                        _level = false;
                    }
                    else
                    {
                        // True:
                        _level = true;
                    }
                    #endregion
               }
          }
 } 

这样的东西,以确保您可以处理或至少警告用户该功能可能无法正常工作。 请注意,在上面我实际上保护了调用并调用了方法; 这样我就可以在任何时候访问_level值,以确保身份验证仍然存在。 并且只在需要时继承或使用它以避免不必要的呼叫。 希望这会有所帮助。


评论更新:

这是针对您的C#项目,您将调用以下内容:

using System.Diagnostics;

上面的组件将为您提供功能。 然后在方法内部调用以下内容。

Process command = new Process();
command.StartInfo.FileName = "notepad.exe";
command.Start();

正如您所看到的那样,它不是技术性的,但它允许您调用batch ,打开程序,甚至运行其他实用程序,如msiexec 希望这会有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM