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

前端 未结 2 840
野的像风
野的像风 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:

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

    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.

    0 讨论(0)
  • 2020-12-29 10:03

    If you want a window on top of Metro, you need it to declare accessibility. Here are the key points:

    1. The application must demand uiAccess (app.manifest)

    2. The application must assert “topmost” window positioning (either in Win32/SetWindowPos or WinForms/WPF’s “Topmost” property, programmatically or otherwise)

    3. Without making changes to the group policy setting, it must be installed to some trusted location [C:\Windows, C:\Program Files, C:\Program Files (x86)].

    a. Note: If you want to be able to run it out of an arbitrary location, you must disable the security setting: “User Account Control: Only elevate UIAccess applications that are installed in secure locations”.

    b. Note2: This is the same as setting HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\ValidateAdminCodeSignatures to 0

    1. Said application cannot be ran in the debugger

    2. If it’s a .NET application

    a. The manifest must be embedded in a post-build step

    b. The application must have “delayed signing” (meaning it cannot be ran from the built-in debugger, although you can build and attach – this is what Microsoft does)

    1. The application must be signed with a trusted certificate.

    2. Said trusted certificate must be installed to the Trusted Root Certificate Authority (this is important! It must not just simply installed)

    For more info see: http://msdn.microsoft.com/en-us/library/ms726294

    0 讨论(0)
提交回复
热议问题