0

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

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

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

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

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

我尝试过: -TopMost = true在 Form_Load 方法内部 - 在 Form_LoadSetForegroundWindow上使用表单句柄调用 - 在 Form_Load 上调用ShowDialog并在构建表单时尝试过。- 调用ActivateForm_Load 以及何时构建表单

这是我的布局:

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

同样,没有 UAC 和requireAdminapp.manifest 内部,这工作正常。但是一旦它以管理员身份运行,不,不会留在前面。

我知道 MS 对SetForegroundWindow更高版本的 Windows(Vista、7、8)提出了更严格的要求,但我确实需要能够使此表单显示为最顶部的活动窗口(如上下文菜单)。

我怎样才能正确地做到这一点?

4

1 回答 1

1

您可以将您的程序分成两部分,一个非管理员需要一半,它位于托盘中并监视中间按钮,另一半需要管理员权限,您在按下鼠标按钮时启动。然后,未抬高的一半可以调用SetForegroundWindowAllowSetForegroundWindow根据需要调用。

如果您想避免每次出现 UAC 提示,您可以通过该CoCreateInstanceAsAdmin方法缓存一个 COM 高程对象并重复使用它。

于 2012-09-06T10:17:09.817 回答