Winforms - 如何禁用主窗体内所有内容的聚焦?

时间:2014-01-22 20:17:24

标签: c# winforms

我有一个非常简单的winforms应用程序,只有这个内部:

public partial class Form1 : Form
{
    [DllImport("user32.dll")]
    static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        var info = new ProcessStartInfo { FileName = "cmd.exe", UseShellExecute = true };
        var process = Process.Start(info);
        Thread.Sleep(500);
        SetParent(process.MainWindowHandle, this.Handle);
    }
}

现在,我需要制作它,以便Form1内部的所有内容根本无法获得任何焦点。我想过对内部的所有内容进行透明控制,但之后控件会获得焦点。此外,我不知道我将使用哪个控件以及如何在Form1内的所有内容之上获得此透明控件。

有没有人对如何解决这个问题有任何想法?

1 个答案:

答案 0 :(得分:0)

您可以创建自己的Panel子类(NonFocusablePanel)并执行以下操作:

class NonFocusablePanel : Panel
{
  static readonly uint WM_SETFOCUS = 0x0007;

  protected override void WndProc(ref Message msg)
  {
    // Ignore focus
    if(msg.Msg == WM_SETFOCUS)
      return;

    base.WndProc(ref msg);
  }
}

然后将此面板放在Form上,Dock设置为FillBackColorTransparent)。

Form_Load上,您最初可以隐藏它并将其隐藏在前面(ZIndex),因此它位于所有其他控件之上:

panel.Hide();
panel.BringToFront();

然后当你想要展示它时......

panel.Show();