2010-09-15 227 views
1

如果正在執行特定進程,我需要鎖定整個窗體。如何鎖定/解鎖C#中的Windows應用程序窗體#

我的表單包含許多控件,如按鈕,組合框。 所有控件應該是禁止狀態,如果正在運行的進程

現在i'n使用從user32.dll中

[DllImport("user32.dll")] 
    public static extern IntPtr FindWindow(String sClassName, String sAppName); 

    [DllImport("user32.dll")] 
    public static extern bool EnableWindow(IntPtr hwnd, bool bEnable); 

但它不能正常工作的兩種方法。

是否有任何其他的想法提前

回答

12

你是什麼意思與鎖?

如果你想阻止使輸入的用戶可以設置

this.Enabled = false; 

主要形式,這將禁用所有子控件,太。

阻止事件發生的解決方案是實現一個消息過濾器:http://msdn.microsoft.com/en-us/library/system.windows.forms.application.addmessagefilter.aspx並攔截鼠標左鍵。

// Creates a message filter. 
[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)] 
public class TestMessageFilter : IMessageFilter 
{ 
    public bool PreFilterMessage(ref Message m) 
    { 
     // Blocks all the messages relating to the left mouse button. 
     if (m.Msg >= 513 && m.Msg <= 515) 
     { 
      Console.WriteLine("Processing the messages : " + m.Msg); 
      return true; 
     } 
     return false; 
    } 
} 


public void SomeMethod() 
{ 

    this.Cursor = Cursors.WaitCursor; 
    this.Enabled = false; 
    Application.AddMessageFilter(new TestMessageFilter(this)); 

    try 
    { 
     Threading.Threat.Sleep(10000); 
    } 
    finally 
    { 
     Application.RemoveMessageFilter(new TestMessageFilter(this)); 
     this.Enabled = true; 
     this.Cursor = Cursors.Default; 
    } 


} 
+0

如果我在(表單)禁用狀態中單擊一個按鈕,該動作發生在表單啓用後 – 2010-09-16 04:54:27

+0

這是真的,沒有想到,但從我的角度來看,這是一個預期的行爲(如果我點擊一個按鈕並且威脅被阻止,我預計事件將隨之而來)。但是如果你真的想,我添加了一個解決方案來攔截左鍵點擊(你可能需要攔截更多的消息) – 2010-09-16 10:11:45

3
Form.Enabled = false; 

不工作要做到這一點

感謝?

+0

其工作,但如果我在(形式)禁用狀態點擊一個按鈕,該操作將表格後發生啓用 – 2010-09-15 10:54:07

+0

@Pramodh:這是不應該的。其他的一定是錯的。你做任何其他winapi電話? – leppie 2010-09-15 11:42:10

+0

不...這裏是一個示例代碼 this.Enable = false; Thread.sleep代碼(5000); this.Enable = TRUE; – 2010-09-16 05:04:01

2

當控制Enabled屬性設置爲false,與對照所有兒童的互動被禁用。您可以在您的方案中使用它,方法是將所有控件放在ContainerControl父級中,並將其設置爲Enabled = false。

事實上,你已經有了這樣一個ContainerContol--你的表單。

1

this.Enable = false; Thread.sleep代碼(5000); this.Enable = TRUE;

在GUI線程中進行處理是不好的做法,您應該使用BackgroundWorker

一個快速而髒的修補程序將在啓用表單之前調用Application.DoEvents()

this.Enable=false; Thread.Sleep(5000); Application.DoEvents(); this.Enable=true;