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

5

如果正在执行某个特定过程,则需要锁定整个表单。

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

现在我正在使用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个回答

15

你所指的“lock”指的是什么?

如果你想防止用户进行输入,你可以设置

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


}

如果我在(表单)禁用状态下点击按钮,则在启用表单后才会执行该操作。 - Thorin Oakenshield
没错,我没有考虑到这一点,但从我的角度来看,这是一种预期的行为(如果我点击一个按钮并且线程被阻塞,我希望事件尽快发生)。但是,如果你真的想要的话,我添加了一个拦截左键单击的解决方案(你可能需要拦截更多的消息)。 - Jürgen Steinblock

4
Form.Enabled = false;

出现问题了吗?


1
它正在工作,但如果我在(表单)禁用状态下点击按钮,则动作会在启用表单后进行。 - Thorin Oakenshield
@Pramodh:不应该发生这种情况。可能还有其他问题。你有调用其他winapi吗? - leppie
这是一个示例代码 this.Enable=false; Thread.Sleep(5000); this.Enable=true; - Thorin Oakenshield
@Pramodh:那样做毫无意义。 - leppie

2
当控件的Enabled属性被设置为false时,该控件及其所有子控件的交互都会被禁用。您可以在场景中使用这个属性,将所有控件放置在一个ContainerControl父控件中,并将其Enabled属性设置为false。
实际上,您已经有了这样一个ContainerControl - 您的Form表单。

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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接