【问题标题】:Do not want Form to display over other application windows不希望表单显示在其他应用程序窗口上
【发布时间】:2010-05-08 23:37:10
【问题描述】:

我通过将在另一个进程中创建的表单的句柄传递给 Show 方法来显示来自一个进程的新表单。我只希望这个新表单显示在传递的表单上方,如 MessageBox。

然而,这个新启动的表单出现在其他应用程序窗口上方,尽管:

  • 将 Process.WindowStyle.Hidden 设置为表单显示进程
  • 覆盖 Form 的 ShowWithoutActivation 和 CreateParams 属性。
  • 确保 Form.TopMost 不正确

我已从第二个进程检查窗口句柄是否有效。 然而,焦点并没有被窃取。

Process A:
Pass (Form) window handle to a new Process B via the command line

Process B:
Display a new Form using Form.Show(anotherProcessWindowHandle)

【问题讨论】:

    标签: .net winforms focus


    【解决方案1】:

    你正在与SetForegroundWindow() 的规则作斗争。请注意备注部分中的“它不起作用”的长列表。 AllowSetForegroundWindow() 是解决方案。


    为确保一个窗口总是重叠另一个窗口,使用带有 owner 参数的 Show() 或 ShowDialog() 覆盖来显示它。例如:

     using (var dlg = new MyMessageBoxForm(ex.Message)) {
         dlg.ShowDialog(this);
     }
    

    拥有的窗口始终显示在其所有者的顶部,并与其所有者一起被最小化和关闭。


    Windows SDK 明确禁止将另一个进程的窗口设为您的窗口的所有者。 Windows 窗体不允许您这样做。然而,Windows 版本 3 应用程序有一个 appcompat 模式。当时,这样做没有问题,它不支持线程。在您的窗口上 P/Invoke SetParent() 并从其他进程传递窗口的窗口句柄。它违反了保修条款,但往往效果很好。

    【讨论】:

    • 不过,我想要 SetForegroundWindow 的相反行为。你能详细说明一下吗?
    • 不计算。你想让它在后台,总是被其他窗口覆盖?
    • 我希望这个新的表单作为传递给第二个进程的窗口(句柄)的消息框。如果第一个进程/窗口在前台,那么 MessageBox 应该出现在窗口上方,但如果窗口不可见或 MessageBox 出现的区域被遮挡,则 MessageBox 不应该显示。
    猜你喜欢
    • 2017-06-17
    • 2011-05-27
    • 1970-01-01
    • 2018-07-17
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多