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

前端 未结 2 841
野的像风
野的像风 2020-12-29 09:35

I write a small desktop application (main form) in the C# language (.net). And i want to have my application in top of the start menu (Windows 8), just like the \"camtasia s

2条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2020-12-29 09:56

    In order to force your application above Metro's User-Interface you'll need to do the following:

    1. Create a Win32 Project
    2. Finish the wizard with no changes.
    3. Change the CreateWindowEXand set WS_EX_TOPMOST
    4. Go to Project.Properties and link to manifest file.
    5. Change UAC to bypass UI Protection; should be /uiAccess = "true"
    6. Build your project.
    7. Use the SignTool to sign the application.
    8. Ensure the application is stored in Program Files or Program Files (x86)
    9. Run your application.
    10. Load your Start Menu and your application should be running above Metro.

    Your manifest should look like:

    
        
            
            
            
        
    
    

    By default it is set to false if the attribute is omitted, or a manifest doesn't exists for your assembly. With it false you will not be able to gain access to ProtectedUI.

    More information on the security can be found here:

    Here is a script that may work or allow modification to test 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
                   }
              }
     } 
    

    Something like that to ensure that it you can handle or at least alert the user that the feature may not work. Please note that in the above I actually protect the call and invoke the method; that way I can access the _level value at any point to ensure the authentication remains present. And it is only inherited or used when desired to avoid unnecessary calls. Hopefully that helps.


    Update for Comment:

    This is for your C# Project, you'd call the following:

    using System.Diagnostics;

    The above assembly will provide you the capability. Then inside a method just invoke the following.

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

    As you can see it isn't to technical, but it will allow you to call a batch, open a program, or even run other utilities such as msiexec. Hopefully that helps.

提交回复
热议问题