如果正在执行特定进程,我需要锁定整个表单。
我的表单包含许多控件,如按钮,组合框。 如果进程正在运行,则所有控件都应处于禁用状态
现在我使用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);
但它无法正常工作。
还有其他想法吗
提前致谢
答案 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;