Как я могу сделать свое приложение сверху в стартовом меню?

Я пишу небольшое настольное приложение (основная форма) на языке С# (.net). И я хочу, чтобы мое приложение было в верхней части стартового меню (Windows 8), так же, как "camstasia studio screenrecoder".

Посмотрите снимок экрана, который я хочу для моего небольшого приложения.

enter image description here

Какой код я должен добавить в свое приложение?

Примечание: Я пытаюсь установить topMost = true, и это не работает.

Ответ 1

Если вам нужно окно сверху Metro, вам нужно объявить его доступность. Вот ключевые моменты:

  • Приложение должно требовать uiAccess (app.manifest)

  • Приложение должно утверждать "самое верхнее" позиционирование окна (либо в Win32/SetWindowPos, либо в WinForms/WPF "Самое верхнее" свойство, программно или иначе)

  • Без внесения изменений в параметр групповой политики он должен быть установлен в определенное доверенное место [C:\Windows, C:\Program Files, C:\Program Files (x86)].

а. Примечание. Если вы хотите запустить его из произвольного местоположения, вы должны отключить параметр безопасности: "Контроль учетных записей пользователей: только поднять приложения UIAccess, установленные в безопасных местах".

б. Примечание2: Это то же самое, что установка HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\ValidateAdminCodeSignatures в 0

  • Указанное приложение не может быть запущено в отладчике

  • Если это приложение .NET

а. Манифест должен быть встроен в этап после сборки.

б. Приложение должно иметь "задержанное подписание" (это означает, что он не может быть запущен из встроенного отладчика, хотя вы можете создавать и прикреплять - это то, что делает Microsoft)

  • Приложение должно быть подписано с доверенным сертификатом.

  • Указанный доверенный сертификат должен быть установлен в доверенный корневой центр сертификации (это важно! Он не просто устанавливается)

Подробнее см.: http://msdn.microsoft.com/en-us/library/ms726294

Ответ 2

Чтобы заставить приложение работать над Metro-интерфейсом Metro, вам необходимо сделать следующее:

  • Создайте проект Win32
  • Закончите мастер без изменений.
  • Измените CreateWindowEX и set WS_EX_TOPMOST
  • Перейдите в Project.Properties и перейдите к файлу манифеста.
  • Изменить UAC для обхода защиты пользовательского интерфейса; должен быть /uiAccess = "true"
  • Создайте свой проект.
  • Используйте SignTool для подписи приложения.
  • Убедитесь, что приложение хранится в Program Files или Program Files (x86)
  • Запустите приложение.
  • Загрузите Start Menu, и ваше приложение должно работать над Metro.

Ваш манифест должен выглядеть так:

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

По умолчанию он установлен на false, если атрибут опущен, или манифест не существует для вашей сборки. С его помощью false вы не сможете получить доступ к ProtectedUI.

Более подробную информацию о безопасности можно найти здесь:

Вот script, который может работать или разрешать модификацию для проверки 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 в любой момент, чтобы убедиться, что аутентификация остается. И он только унаследован или используется по желанию, чтобы избежать ненужных вызовов. Надеюсь, это поможет.


Обновление для комментариев:

Это для вашего проекта С#, вы вызываете следующее:

using System.Diagnostics;

Вышеупомянутая сборка предоставит вам возможность. Затем внутри метода просто вызовите следующее.

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

Как вы можете видеть, это не технический, но он позволит вам вызвать batch, открыть программу или даже запустить другие утилиты, такие как msiexec. Надеюсь, это поможет.