2014-01-22 28 views
0

我有一个非常简单的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中的所有内容之上获得此透明控件。

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

+0

您可以尝试'this.Enabled = false;' – endofzero

+0

听起来像一个XY问题。简单的方法是使用另一个没有任何值得关注的简单表单,使用ShowDialog()显示它并使用* that *作为父级。 –

回答

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设置为Fill(和BackColorTransparent)。

在您最初可以隐藏它,并把它前面(ZIndex),所以它是所有其他控件的顶部:

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

然后,当你想要显示它...

panel.Show(); 
+0

你可能试过用我的代码使用你的解决方案吗?因为你的解决方案看起来不错,但我无法使它工作,所以我的表单里面的命令窗口仍然是可以调整的。 :/ – ojek

+0

我会稍后再尝试,目前没有VS和我在一起。 – Erik

相关问题