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

时间:2013-01-31 15:36:31

标签: c# winforms windows-8

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

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

enter image description here

我必须在我的应用程序中添加哪些代码?

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

2 个答案:

答案 0 :(得分:5)

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

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

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

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

    < / LI>

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

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

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

    2. 如果是.NET应用程序

    3. 一个。清单必须嵌入后构建步骤

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

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

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

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

答案 1 :(得分:3)

为了强制您的应用程序高于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上运行。
  11. 你的清单应该如下:

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

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

    可以找到有关安全性的更多信息here

    这是一个可以工作或允许修改以测试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。希望这会有所帮助。