如何在C#中锁定/解锁Windows应用程序表单

时间:2010-09-15 09:10:53

标签: c# winforms

如果正在执行特定进程,我需要锁定整个表单。

我的表单包含许多控件,如按钮,组合框。 如果进程正在运行,则所有控件都应处于禁用状态

现在我使用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);

但它无法正常工作。

还有其他想法吗

提前致谢

4 个答案:

答案 0 :(得分:13)

锁是什么意思?

如果您想阻止用户进行输入,您可以设置

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;
    }


}

答案 1 :(得分:4)

Form.Enabled = false;

不工作?

答案 2 :(得分:2)

当控件Enabled属性设置为false时,将禁用与该控件其所有子项的交互。您可以在场景中使用它,方法是将所有控件放在ContainerControl父级中,并将其设置为Enabled = false。

事实上,你已经有了这样一个ContainerContol - 你的表单。

答案 3 :(得分:2)

  

this.Enable = FALSE; Thread.sleep代码(5000); this.Enable = TRUE;

在GUI线程中进行处理是不好的做法,您应该使用BackgroundWorker

快速而肮脏的解决方法是在启用表单之前致电Application.DoEvents()

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