当选择一个表单时,使与程序关联的所有表单显示在最前面
本文关键字:表单 关联 程序 前面 显示 选择 一个 | 更新日期: 2023-09-27 18:21:31
我的应用程序中有两个表单MainForm
和HexCompare
。如果我从应用程序中点击另一个窗口,然后再点击两个表单中的一个,只有其中一个出现在前面。如果我单击这两个表单中的任何一个,它将使两者都位于应用程序中所有打开表单的顶部,我该如何做到这一点?现在,我需要单独选择每个表单,将它们放在我的窗口堆栈的顶部(由于HexCompare
将ShowInTaskbar
设置为false
,这可能会非常烦人
按照我想要的方式工作的一个很好的例子是大多数"查找"对话框的工作方式。如果单击"查找"对话框,则如果主窗体被另一个应用程序隐藏,则它会将主窗体显示在前面;如果单击主窗体,则如果它被另一应用程序隐藏则"查找"对话会显示在前面。
如何调用MainForm
。
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
如何调用HexCompare
private void lstCaputres_SelectedIndexChanged(object sender, EventArgs e)
{
var selectedItem = (Tuple<DateTime, byte[]>)lstCaputres.SelectedItem;
if (hexCompare == null || hexCompare.IsDisposed)
{
hexCompare = new HexCompare(selectedItem.Item2);
hexCompare.Show();
}
else
hexCompare.ChangeValue(selectedItem.Item2);
}
编辑:
Parent
的HexCompare
的值似乎是Null
。如果我能以某种方式将其设置为MainForm
,这会解决我的问题吗?如果是,我该如何设置?
第2版:
我已经使用Tigran的解决方案半解决了它,但当每个表单都被放在前面时,它会导致闪烁,如果有更好的解决方案,我仍然感兴趣。
//In MainForm.cs
private void MainForm_Activated(object sender, EventArgs e)
{
hexCompare.BringToFront();
this.BringToFront();
}
//in HexCompare.cs
private void HexCompare_Activated(object sender, EventArgs e)
{
parent.BringToFront();
this.BringToFront();
}
您可以使用下面的API包装器将表单带到z顺序的前面,而不必让它窃取焦点。这个函数可以在主窗体的Activated事件中调用,只需将HexCompare窗体作为参数传递给它即可。这与其他答案没有太大区别,但我从未见过你在评论中提到的任何闪烁。
private const int SW_SHOWNOACTIVATE = 4;
private const int HWND_TOPMOST = 0;
private const uint SWP_NOACTIVATE = 0x0010;
[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
static extern bool SetWindowPos(
int hWnd, // window handle
int hWndInsertAfter, // placement-order handle
int X, // horizontal position
int Y, // vertical position
int cx, // width
int cy, // height
uint uFlags); // window positioning flags
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
public void ShowInactiveTopmost(Form frm)
{
ShowWindow(frm.Handle, SW_SHOWNOACTIVATE);
SetWindowPos(frm.Handle.ToInt32(), HWND_TOPMOST,
frm.Left, frm.Top, frm.Width, frm.Height,
SWP_NOACTIVATE);
}
对我来说,这似乎足以在两种形式上设置TopMost=true
和调用BringToFront()
。
hexCompare = new HexCompare(selectedItem.Item2);
hexCompare.TopMost = true;
hexCompare.Show();
hexCompare.BringToFront();
像这样的东西。