【问题标题】:Bring window to front w/out focus将窗口置于前面,无焦点
【发布时间】:2012-08-18 03:26:37
【问题描述】:

我的 .NET 应用程序在后台运行,偶尔会创建并显示一个表单。表单应该在所有其他窗口上方可见,但没有焦点。

我的第一种方法是设置表单的 TopMost 属性,但在许多情况下由于我无法解释的原因而失败。

然后我尝试在 Shown 事件处理程序中调用 BringToFront,但没有任何作用。

我还尝试了 BringWindowToTop API,它返回 true(= 成功),但没有结果。

现在我坚持使用 SetForegroundWindow,它可以工作,但也可以将焦点放在窗口上(应该如此)。

任何建议将不胜感激。

(另外,我可以毫无问题地偷取焦点是正常的吗?)

【问题讨论】:

  • 我最初的反应是设置 TopMost 但你已经说过失败了。因此,您可能需要详细说明这些您无法解释的原因。

标签: .net windows winforms winapi windows-7


【解决方案1】:

这可能会对您有所帮助:

[DllImport("user32.dll")]
public static extern bool SetWindowPos (IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
void Exmpl() {
    IntPtr HWND_TOPMOST = new IntPtr(-1);
    uint SWP_NOACTIVATE = 0x0010;
    uint SWP_NOMOVE = 0x0002;
    uint SWP_NOSIZE = 0x0001;
    SetWindowPos(form.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
}

【讨论】:

  • 添加 SWP_NOACTIVATE 是与 Form.TopMost 所做的唯一区别。 (这可以在托管代码中处理)。可能需要知道他为什么不能使用 TopMost。
猜你喜欢
  • 2022-10-06
  • 1970-01-01
  • 2011-11-04
  • 2012-10-08
  • 2011-10-07
  • 1970-01-01
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多