C# 如何在C中锁定/解锁windows应用程序窗体#
如果特定进程正在执行,我需要锁定整个表单 我的表单包含许多控件,如按钮、组合框。 如果进程正在运行,则所有控件都应处于禁用状态 现在我正在使用user32.dll中的两个方法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
[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:那将一事无成。如果我在(表单)禁用状态下单击一个按钮,该操作将在表单启用后发生。这是真的,没有想到,但从我的角度来看,这是一种预期行为(如果我单击一个按钮,威胁被阻止,我希望事件尽快发生).但是如果你真的想,我添加了一个拦截左键点击的解决方案(你可能需要拦截更多的消息)