UAC窗口在上面

时间:2012-09-06 07:25:59

标签: c# windows winforms winapi

我似乎在这里陷入了死胡同。我有一个项目执行以下操作:

  • 只是跑步并停留在通知区域
  • 当用户按下鼠标中键时,它会显示一个表单
  • 然后,用户可以从表单中选择任何内容,并感到高兴。

这工作正常,但不起作用的是,当表单显示时,它不会激活。

现在,在我将app.manifest修改为requireAdmin之前,它工作正常。每当表格显示时,它就会活跃起来。

但是现在我正在以管理员身份运行该表单,因为我需要能够使用它来控制我们的其他应用程序(也是以管理员身份运行),表单出现就好了但是没有不要激活。

我试过了:   - Form_Load方法内部的TopMost = true   - 使用Form_Load上的表单句柄调用SetForegroundWindow   - 在Form_Load上调用ShowDialog,并在构建表单时尝试使用它。   - 在Form_Load上调用Activate以及在构建表单时调用

这是我的布局:

  • 程序运行,由于清单需要UAC权限,用户同意并启动
  • 只显示一个通知图标,显示一个漂亮的小气泡,说它正在运行
  • Program.cs监视键盘/鼠标挂钩
  • 当触发鼠标中键或任何键盘挂钩时,它会创建一个新的表单对象
  • 设置表单的显示位置
  • 然后最终显示表格。

再次,在app.manifest中没有UAC和requireAdmin,这很好。但是一旦它作为管理员运行,nope,就不会留在前面。

我知道MS已经对更高版本的Windows(Vista,7,8)的SetForegroundWindow要求更加严格,但我真的需要能够将此表单显示为最顶层的活动窗口(如上下文菜单)。

我该如何正确地做到这一点?

1 个答案:

答案 0 :(得分:1)

您可以将程序拆分为两个,非管理员需要一半位于托盘中并监视中间按钮,另一半需要管理员权限,按下鼠标按钮时启动。然后,非提升的一半可以根据需要拨打SetForegroundWindowAllowSetForegroundWindow

如果您希望每次都可以通过CoCreateInstanceAsAdmin方法缓存COM提升对象而避免UAC提示,并重复使用它。