在其他一切背后展示一张表格,而不是偷不懂焦点?

Ian*_*oyd 6 .net c# winforms

StackOverflow上存在一个关于如何在不窃取焦点的情况下显示表单的问题.答案是覆盖ShowWithoutActivation并返回true:

protected override bool ShowWithoutActivation
{
  get { return true; }
}
Run Code Online (Sandbox Code Playgroud)

这很好用.

现在我想更进一步.我希望展示一个表格(即使其可见),但让它落后于z顺序中的其他表格.

可能在.net?

如果没有,可以使用P/Invoke吗?

奖金Chatter

通话SendToBack()不起作用:

   RunnerForm frm = new RunnerForm();
// frm.Show();
   frm.Visible = true;
   frm.SendToBack();
Run Code Online (Sandbox Code Playgroud)

Lar*_*ech 6

使用SetWindowPos函数的一点点PInvoke

public static class HWND {
  public static readonly IntPtr
  NOTOPMOST = new IntPtr(-2),
  BROADCAST = new IntPtr(0xffff),
  TOPMOST = new IntPtr(-1),
  TOP = new IntPtr(0),
  BOTTOM = new IntPtr(1);
}

public static class SWP {
  public static readonly int
  NOSIZE = 0x0001,
  NOMOVE = 0x0002,
  NOZORDER = 0x0004,
  NOREDRAW = 0x0008,
  NOACTIVATE = 0x0010,
  DRAWFRAME = 0x0020,
  FRAMECHANGED = 0x0020,
  SHOWWINDOW = 0x0040,
  HIDEWINDOW = 0x0080,
  NOCOPYBITS = 0x0100,
  NOOWNERZORDER = 0x0200,
  NOREPOSITION = 0x0200,
  NOSENDCHANGING = 0x0400,
  DEFERERASE = 0x2000,
  ASYNCWINDOWPOS = 0x4000;
}

[DllImport("user32.dll")]
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags);

private void button1_Click(object sender, EventArgs e) {
  RunnerForm frm = new RunnerForm();
  SetWindowPos(frm.Handle, HWND.BOTTOM, 0, 0, 0, 0, SWP.SHOWWINDOW | SWP.NOMOVE | SWP.NOOWNERZORDER | SWP.NOSIZE | SWP.NOACTIVATE);
}
Run Code Online (Sandbox Code Playgroud)