Как я могу сделать свое приложение сверху в стартовом меню?
Я пишу небольшое настольное приложение (основная форма) на языке С# (.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
а. Манифест должен быть встроен в этап после сборки.
б. Приложение должно иметь "задержанное подписание" (это означает, что он не может быть запущен из встроенного отладчика, хотя вы можете создавать и прикреплять - это то, что делает 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
. Надеюсь, это поможет.