9

我对 C# 非常陌生,但仍在努力解决它(在一些非常有耐心的朋友的帮助下)。

我在将新 Windows 窗体的TopMost属性设置为true. 我有两个(几乎)相同的表格;1个可以正常工作,一个不能正常工作。

两种形式的TopMost属性都设置为true

  • Form1 显示窗口,当我尝试在它后面单击时,表单会闪烁几次并发出窗口哔声。
  • Form2 也显示表单,但是当我在它后面单击时,表单变灰(或失去焦点),我可以单击主表单。

我已经搜索了这个问题的答案,并找到了一个建议放入this.TopMost = true;表单的加载事件的答案,但这没有用。

我唯一更改的可能会或可能不会产生影响的是 Form1 是使用在属性中设置的 .NET 4.5 创建的,在创建 Form2 之前,我将其更改为 .NET 3.5(客户端配置文件)。我试过把它改回来,但它没有帮助。在我再次删除并创建 Form2 之前,有人有什么想法吗?

提前谢谢了。(如果您需要更多信息,请告诉我)

4

6 回答 6

14

TopMost是一种属性,用于确保一个窗口始终显示在应用程序中的所有其他窗口之上。微软的例子是一个查找和替换工具。

您发现的不同之处在于 Form1 通过使用ShowDialog创建为模式对话框。显示对话框确保您的表单必须关闭,然后才能再次使用应用程序中的所有其他窗口。例如; 使用表单获取用户数据以输入到父表单数据库。

当您不介意您的用户是否完成了他们的对话时,使用显示,例如允许您的用户有机会使用一些有助于程序主要功能的实用程序(例如计时器、秒表)。

在使用不同的 .Net 框架时,我能想到的唯一视觉差异是不同的窗口对话框,例如 OpenFileDialog,它们已在整个框架中更新

于 2013-05-31T17:36:50.727 回答
7

它可以帮助你;

frm.TopLevel = true;
frm.TopMost = true;
于 2013-05-31T16:43:08.257 回答
3

Microsoft 的此链接确认这可能是 Windows 7 和 Windows Server 2008 R2 中的错误我在 Windows 7 Embedded 系统中遇到过此问题,并且提供的补丁修复了该问题,因此请考虑查看 :)

http://support.microsoft.com/kb/2587473/en-us

希望对您有所帮助!

于 2014-10-02T13:54:24.583 回答
2

DIY 方式 - 100% 有效!

public static class User32
{
    public const int SW_HIDE = 0;
    public const int SW_SHOW = 5;
    public const int SW_SHOWNORMAL = 1;
    public const int SW_SHOWMAXIMIZED = 3;
    public const int SW_RESTORE = 9;

    [DllImport("user32.dll")]
    public static extern bool SetForegroundWindow(IntPtr hWnd);
    [DllImport("user32.dll")]
    public static extern bool AllowSetForegroundWindow(uint dwProcessId);
    [DllImport("user32.dll")]
    public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
}

User32.AllowSetForegroundWindow((uint)Process.GetCurrentProcess().Id);
User32.SetForegroundWindow(Handle);
User32.ShowWindow(Handle, User32.SW_SHOWNORMAL);
于 2016-07-04T21:05:38.283 回答
0

我的解决方案中有类似的问题。使用重载的 Show-function 后,它起作用了:

frm.TopLevel = true;
frm.TopMost = true;
frm.Show(this)
于 2017-01-02T06:31:20.373 回答
0

在Shown事件中添加以下代码:

this.TopMost = true;
this.Focus();
this.TopMost = true;
于 2017-12-16T23:27:05.673 回答