C# 如何禁用和启用点击接收。。。?

C# 如何禁用和启用点击接收。。。?,c#,C#,我想重新设置MouseEventArgs,使其始终只运行一次。 如果有人点击按钮不止一次(10次),那么程序运行10次,以此类推 我的代码工作不好,因为如果有人点击按钮12次或更多次,它就会运行。 我想重置鼠标,或者做其他解决方案 Windows窗体应用程序(XP,32位) 尝试创建扩展System.Windows.Forms.Button的自定义控件,而不是在事件中写入逻辑 但据我所知,您的代码使您单击事件处理程序始终与函数链接,如果mc值以0开头 希望它对您有所帮助当您禁用按钮时,您可能不会

我想重新设置MouseEventArgs,使其始终只运行一次。 如果有人点击按钮不止一次(10次),那么程序运行10次,以此类推

我的代码工作不好,因为如果有人点击按钮12次或更多次,它就会运行。 我想重置鼠标,或者做其他解决方案

Windows窗体应用程序(XP,32位)


尝试创建扩展System.Windows.Forms.Button的自定义控件,而不是在事件中写入逻辑

但据我所知,您的代码使您单击事件处理程序始终与函数链接,如果mc值以0开头


希望它对您有所帮助

当您禁用按钮时,您可能不会再收到任何鼠标事件,因此您不必更改任何事件处理程序。编写应该在处理程序中执行一次的代码,并禁用该按钮。因此,只要该按钮被禁用,代码就无法再执行。

您正试图在主线程上执行一些长时间运行的作业。 看起来您禁用了按钮,应该忽略以下单击,但它们实际上已放入队列中。如果您查看事件队列,则每次单击按钮都会在按钮启用时完成:

Click
Disable button
Wait 2 seconds
Enable button
Click
...
请尝试以下代码:

private void button1_MouseClick(object sender, MouseEventArgs e)
{
        //disable button on main thread
        button1.Enabled = false;

        Thread worker = new Thread(() =>
        {
           //do time consuming job
           System.Threading.Thread.Sleep(2000);

           //enable button (from the main thread)
           this.Invoke((MethodInvoker)delegate
           {
              textBox1.AppendText("Click " + e.Clicks + "\n");
              button1.Enabled = true;
           });
        });

        worker.Name = "Button 1 worker";
        worker.Start();
}
现在,耗时的工作在单独的线程上完成,UI事件将按预期工作:

Click
Disable button
Do job on another thread ------------> Wait 2 seconds
Click - ignored (button is disabled)        |
Click - ignored (button is disabled)        |
Click - ignored (button is disabled)        |
Click - ignored (button is disabled)        |                                                    
                                       Enable button
Click
Disable button ...

您可以创建一个bool来指示代码是否已经执行,而不是改变事件本身。经典的XY问题:)顺便问一下:为什么要将事件处理程序方法重新分配(或附加)到按钮?Ommit这行。因为我想在System.Threading.Thread.Sleep(2000)之后允许它;他跑了。我只允许一次单击一次。因此,您希望按钮在被单击后禁用2秒钟,然后再次启用以接收进一步的单击吗?是。:)但该按钮将无法收到一次以上的点击。因为按钮会收到多次单击,所以代码将运行更多次。我只想在按下/单击按钮后单击一次,然后再运行一次。我不想永远禁用按钮,只是单击直到线程。睡眠运行。@RohlandHE好吧,你也可以在窗体上实现一个计时器,持续时间为2秒,当这个定时器被执行时,你总是要检查你的按钮是否被禁用,如果是,你要启用它。下一次单击按钮时,它将再次被禁用。非常感谢!:)
Click
Disable button
Do job on another thread ------------> Wait 2 seconds
Click - ignored (button is disabled)        |
Click - ignored (button is disabled)        |
Click - ignored (button is disabled)        |
Click - ignored (button is disabled)        |                                                    
                                       Enable button
Click
Disable button ...