这个.TopMost = true 不起作用?

11

我对C#非常陌生,仍在努力理解它(得益于一些非常耐心的朋友的帮助)。

我有一个问题,就是设置新的窗体的TopMost属性为true。我有两个几乎相同的表单;其中1个可以正常工作,而另一个则不行。

这两个表单的TopMost属性都设置为true

  • 表单1显示窗口,当我试图在它后面点击时,该表单会闪烁几次并发出Windows提示音。
  • 表单2也显示窗体,但当我在其后面点击时,该窗体会变灰(或失去焦点),我可以在主窗体上点击。

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

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

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


2
你能发一下代码吗? - Reza Shirazian
好的,从哪里开始?如果这样听起来很蠢,我很抱歉! - Kungfauxn00b
7
Form1使用showdialog打开,而Form2使用show打开,与topmost无关。换句话说,Form1是模态的。 - Sayse
记住单个等号用于赋值,双个等号用于相等比较操作符。确保你使用正确的符号! - Liath
6个回答

15

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

你发现的区别在于,Form1是通过使用ShowDialog创建为模式对话框。Show dialog 确保您的表单必须在应用程序中的所有其他窗口可以再次使用之前关闭。例如:使用一个表单来获取用户数据以输入到父表单的数据库中。

Show 在您不介意用户是否完成其对话框时使用,比如允许用户有机会使用一些实用工具(例如计时器、秒表),这将有助于程序的主要功能。

我能想到的仅有的视觉差异是使用不同的.NET框架时,已更新了各种Windows对话框,例如 OpenFileDialog。


使用TopMost时要小心,因为最大化的窗体可能会隐藏在后台任何作为该窗体子级显示的模态对话框! - wecky

8
可能会对你有帮助;
frm.TopLevel = true;
frm.TopMost = true;

对我很有帮助!这适用于主窗体(应用程序表单)的情况。 - A Khudairy

3
这个来自微软的链接确认了Windows 7和Windows Server 2008 R2可能存在一个Bug,我在一个Windows 7嵌入式系统中遇到了这个问题,提供的补丁可以解决这个问题,请考虑查看一下 :)

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

希望它有所帮助!


2
自己动手做 - 百分百有效!
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);

0
在“Shown”事件中添加以下代码:
this.TopMost = true;
this.Focus();
this.TopMost = true;

0

我在我的解决方案中遇到了类似的问题。在使用重载的 Show 函数之后,它就可以工作了:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接