Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按下鼠标向下按钮时循环_C#_Winforms_Mouseevent - Fatal编程技术网

C# 按下鼠标向下按钮时循环

C# 按下鼠标向下按钮时循环,c#,winforms,mouseevent,C#,Winforms,Mouseevent,我想在按下鼠标左键时使用loop: private void Loop_MouseDown(object sender, MouseEventArgs e) { while (e.Button==MouseButtons.Left) { //Loop } } 我无法使用此线程中的解决方案: 因为我通过RS232发送数据,使用自己的时间间隔的计时器不起作用。同样,这

我想在按下鼠标左键时使用loop:

  private void Loop_MouseDown(object sender, MouseEventArgs e)
        {
            while (e.Button==MouseButtons.Left)
            {
            //Loop
            }
        }
我无法使用此线程中的解决方案:
因为我通过RS232发送数据,使用自己的时间间隔的计时器不起作用。同样,这个主题的任何解决方案对我都不起作用。 它也不能像这里这样工作:

 if (e.Button == MouseButtons.Left)
    {
        //loop
    }
此解决方案也不起作用:

bool isLooping = false;

//on mouse down
private void myControl_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) {
    isLooping = true;
    runLoop();
}

//on mouse up event
private void myControl_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) {
    isLooping = false;
}

//This is the main loop you care about.  Put this in your application
//This should go in its own thread
void runLoop() {
    while (isLooping) {
        //do stuff
    }
}
因为调用runLoop会阻塞线程,所以MouseUp事件永远不会触发


那么如何使其正常工作呢?

如果使用计时器不起作用,则需要在不同的线程上发送数据,并通过
鼠标处理程序向该线程发送信号。

正确的方法是将rs-232发送功能放在单独的线程中,以便UI保持响应,然后,您可以在鼠标事件更改时启动和停止它

此页面可能有用:


使用后台工作人员。非常适合你的问题


将循环函数放入worker并在鼠标上启动/停止worker事件。

这些场景的实现非常复杂-请参阅用于存储状态的处理程序和布尔变量

我建议使用

编辑:

它可能会稍微设计过度(我不知道这是否是Elfoc想要实现的唯一场景)。在Rx中,您可以创建可观察的事件序列

var mouseDown = Observable.FromEvent<MouseButtonEventArgs>(source, "MouseDown"); 
var mouseUp = Observable.FromEvent<MouseButtonEventArgs>(image, "MouseUp"); 
var mouseMove = from evt in Observable.FromEvent<MouseEventArgs>(image, "MouseMove") 
  select evt.EventArgs.GetPosition(this);
并使用Rx操作符组合它-直到任何鼠标上升事件被触发,在鼠标左键下降时占据所有位置

var q = from position in leftMouseDown  
    from pos in mouseMove.Until(mouseUp) 
    select new { X = pos.X - imageOffset.X, Y = pos.Y - imageOffset.Y }; 
最后,订阅可观察到的位置序列并做好准备

q.Subsribe(value => { ... });

从代码中稍作修改。

您是否考虑过使用API获取鼠标按钮的当前状态?当您说“停止”时,您的意思是“停止”?sry的意思是RunWorkerAsync&CancelAsync,这是一个简单而好的解决方案。Tnx;)
q.Subsribe(value => { ... });