C# 如何在C中锁定/解锁windows应用程序窗体#

C# 如何在C中锁定/解锁windows应用程序窗体#,c#,winforms,C#,Winforms,如果特定进程正在执行,我需要锁定整个表单 我的表单包含许多控件,如按钮、组合框。 如果进程正在运行,则所有控件都应处于禁用状态 现在我正在使用user32.dll中的两个方法 [DllImport("user32.dll")] public static extern IntPtr FindWindow(String sClassName, String sAppName); [DllImport("user32.dll")] public static ext

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

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

现在我正在使用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);
但它不能正常工作

还有其他办法吗

提前谢谢

Form.Enabled = false;

不工作?

锁是什么意思

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

this.Enabled = false;
在主窗体上,也将禁用所有子控件

防止触发事件的解决方案是实现一个消息过滤器:并拦截鼠标左键

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


}
//创建消息筛选器。
[SecurityPermission(SecurityAction.LinkDemand,Flags=SecurityPermissionFlag.UnmanagedCode)]
公共类TestMessageFilter:IMessageFilter
{
公共bool预过滤器消息(参考消息m)
{
//阻止与鼠标左键相关的所有消息。

当控件启用属性设置为false时,如果(m.Msg>=513&&m.Msg,则禁用与该控件及其所有子控件的交互。您可以在场景中使用该属性,方法是将所有控件放置在ContainerControl父控件中,并将其Enabled=false

事实上,你已经有了这样一个容器本体——你的表单

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

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

一个快速而肮脏的修复方法是在启用表单之前调用
Application.DoEvents()

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

它正在工作,但如果我在(表单)禁用状态下单击按钮,则该操作将在表单之后发生enabled@Pramodh:不应该发生这种情况。一定是其他错误。是否进行了任何其他winapi调用?否…以下是示例代码this.Enable=false;Thread.Sleep(5000);this.Enable=true;@Pramodh:那将一事无成。如果我在(表单)禁用状态下单击一个按钮,该操作将在表单启用后发生。这是真的,没有想到,但从我的角度来看,这是一种预期行为(如果我单击一个按钮,威胁被阻止,我希望事件尽快发生).但是如果你真的想,我添加了一个拦截左键点击的解决方案(你可能需要拦截更多的消息)