2012-09-06 46 views
0

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

  • 只是运行和停留在通知区域
  • 当用户按下鼠标中键,它显示了一个形式
  • 然后用户可以从表单选择了什么,并快乐。

这工作得很好,但不工作的是,当窗体显示时,它不会激活。

现在,在我修改app.manifest到requireAdmin之前,它工作正常。任何时候显示表格,它都会激活。

但是现在我以管理员身份运行窗体,因为我需要能够使用它控制我们的其他应用程序之一(即以管理员身份运行),窗体显示正常,但不激活。

我曾尝试: - TopMost = true在Form_Load方法 内 - 调用SetForegroundWindow与形式处理上的Form_Load - 调用上都的Form_Load ShowDialog,也试了一下形式在构建时。 - 调用上的Form_Load Activate以及当表单建

这里作为我的布局:

  • 程序运行,需要UAC权限由于清单,用户同意,它揭开序幕
  • 只有通知图标出现,显示了一个可爱的小气泡说,它的运行
  • 的Program.cs监控键盘/鼠标钩子
  • 当鼠标中键,或任何键盘钩子被触发,它会创建一个新的表单对象
  • 设置表单应该出现的位置
  • 然后最后显示表单。

再次,没有UAC和requireAdmin里面的app.manifest,这工作正常。但一旦它以管理员身份运行,不会停留在前面。我知道MS已经使得SetForegroundWindow的要求在更高版本的Windows(Vista,7,8)上更严格,但是我真的需要能够使这个表单显示为最顶层的活动窗口(就像上下文菜单)。

我该如何做到这一点?

+0

你正在犯几个可用性罪。如果你想确保你的窗口获得前景的爱,那么你需要使用上下文菜单来激活它。 –

+0

不太清楚你所指的是什么。这不像我是关键日志或类似的东西。 – zackrspv

回答

1

您可以将程序拆分为两个,一个非管理员需要一半位于托盘中,并观察中间按钮,另一半需要您按下鼠标按钮时启动的管理员权限。非升高的一半可以根据需要调用SetForegroundWindowAllowSetForegroundWindow

如果您希望在每次通过CoCreateInstanceAsAdmin方法缓存COM立面对象时避免UAC提示并反复使用它。