如何在开始菜单中将我自己的应用程序置于顶部?
我用C#语言(.net)编写了一个小型桌面应用程序(主窗体)。 我希望将我的应用程序放在开始菜单(Windows 8)的顶部,就像“camtasia studio screenrecoder”一样。
看截图我想要的小应用程序。
我必须在我的应用程序中添加什么代码?
注意:我尝试设置topMost = true
,但这不起作用。
如果您想要一个位于Metro顶部的窗口,则需要它来声明可访问性。 以下是要点:
-
应用程序必须要求uiAccess(app.manifest)
-
应用程序必须断言“最顶层”窗口定位(在Win32 / SetWindowPos或WinForms / WPF的“Topmost”属性中,以编程方式或其他方式)
-
如果不更改组策略设置,则必须将其安装到某个受信任位置[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
为了强制您的应用程序高于Metro的用户界面,您需要执行以下操作:
- 创建一个Win32项目
- 完成向导而不做任何更改。
- 更改
CreateWindowEX
并set WS_EX_TOPMOST
- 转到
Project.Properties
并链接到清单文件。 - 更改UAC以绕过UI保护; 应该是
/uiAccess = "true"
- 建立你的项目。
- 使用
SignTool
对应用程序进行签名。 - 确保应用程序存储在
Program Files
或Program Files (x86)
- 运行您的应用程序
- 加载“
Start Menu
,您的应用程序应该在Metro上方运行。
您的清单应如下所示:
默认情况下,如果省略该属性,或者程序集不存在清单,则将其设置为false
。 如果false
您将无法访问ProtectedUI
。
有关安全性的更多信息,请访问 :
这是一个可以工作或允许修改以测试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 } } }
类似的东西,以确保您可以处理或至少提醒用户该function可能无法正常工作。 请注意,在上面我实际上保护了调用并调用了方法; 这样我就可以在任何时候访问_level
值,以确保身份validation仍然存在。 并且只在需要时inheritance或使用它以避免不必要的呼叫。 希望这会有所帮助。
评论更新:
这是针对您的C#项目,您将调用以下内容:
using System.Diagnostics;
上面的组件将为您提供function。 然后在方法内部调用以下内容。
Process command = new Process(); command.StartInfo.FileName = "notepad.exe"; command.Start();
正如您所看到的那样,它不是技术性的,但它允许您调用batch
,打开程序,甚至运行其他实用程序,如msiexec
。 希望这会有所帮助。