2014-01-22 22 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

相關問題