winforms this.TopMost = true不工作?

r7knjye2  于 2022-11-17  发布在  其他
关注(0)|答案(6)|浏览(146)

我是C#的新手,还在努力学习(在一些非常耐心的朋友的帮助下)。
我在将新的windows窗体的TopMost属性设置为true时遇到了问题。一个工作正常,一个不工作。
这两种形式都将TopMost属性设置为true

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

我已经搜索了这个问题的答案,并找到了一个建议将this.TopMost = true;放在窗体的load事件中的答案,但没有起作用。
我所做的唯一更改(可能有影响,也可能没有影响)是Form1是使用属性中的.NET 4.5设置创建的,在创建Form2之前,我将其更改为.NET 3.5(客户端配置文件)。我尝试将其更改回来,但没有任何帮助。在删除并再次创建Form2之前,有人有什么想法吗?
非常感谢。(如果你需要更多的信息,请告诉我)

vwoqyblh

vwoqyblh1#

TopMost是一个属性,用于确保一个窗口总是显示在应用程序中所有其他窗口的上方。微软的例子是一个查找和替换工具。
您发现的不同之处在于,Form1是通过使用ShowDialog创建为模式对话框的。“显示对话框”可确保在再次使用应用程序中的所有其他窗口之前必须关闭窗体。例如:使用表单获取要输入到父表单数据库中的用户数据。
Show用于当你不介意你的用户是否已经完成他们的对话框时,比如允许你的用户有机会使用一些实用程序(如计时器,秒表)来帮助一个程序的主函数。
当使用不同的.Net框架时,我能想到的唯一视觉差异是不同的窗口对话框(如OpenFileDialog),它们在整个框架中进行了更新

h9vpoimq

h9vpoimq2#

它可能会帮助你;

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

xiozqbni3#

此链接从微软确认,这可能是一个错误,在Windows 7和Windows Server 2008 R2我已经面对它在Windows 7嵌入式系统和提供的补丁修复问题,所以请考虑看看:)
http://support.microsoft.com/kb/2587473/en-us
希望它有所帮助!

gdrx4gfi

gdrx4gfi4#

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);
wxclj1h5

wxclj1h55#

在我的解决方案中也有类似的问题。在使用重载的Show函数后,它工作了:

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

gorkyyrv6#

Shown事件中添加以下代码:

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

相关问题