this.TopMost = true不工作?

我是C#的新手,仍然试图让我的头脑(在一些非常耐心的朋友的帮助下)。

我有一个问题,将新窗体的TopMost属性设置为true 。 我有两个(几乎)相同的forms; 1工作正常,而不工作。

这两种forms都将TopMost属性设置为true

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

我已经搜索了这个问题的答案,并找到了一个答案,建议把this.TopMost = true; 在表单的加载事件但但不起作用。

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

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

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

您发现的差异是Form1是通过使用ShowDialog创建的modal dialog。 显示对话框确保在再次使用应用程序中的所有其他窗口之前必须关闭表单。 例如; 使用表单获取用户数据以进入父表单数据库。

当您不介意用户是否已完成对话时,使用显示,例如允许您的用户有机会使用某些实用程序(例如计时器,秒表),这将有助于程序的主要function。

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

它可能会帮助你;

 frm.TopLevel = true; frm.TopMost = true; 

来自Microsoft的这个链接确认可能是Windows 7和Windows Server 2008 R2中的一个Bug我在Windows 7 Embedded系统中遇到过它并且提供的补丁修复了这个问题所以请考虑一下:)

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

希望它有所帮助!

大锤的方式做到了! 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); 

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

 frm.TopLevel = true; frm.TopMost = true; frm.Show(this) 

Shown事件中添加以下代码:

 this.TopMost = true; this.Focus(); this.TopMost = true;