2011-10-10 76 views
2

我想使用循环而左mousebutton按下:C#循环,当鼠标按下按钮按下

private void Loop_MouseDown(object sender, MouseEventArgs e) 
     { 
      while (e.Button==MouseButtons.Left) 
      { 
      //Loop 
      } 
     } 

我不能从这个线程使用的解决方案:
C# how to loop while mouse button is held down 因为我通过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事件永远不会火。

那么如何使它正常工作?

+0

你为什么要这样? – TJHeuvel

+0

为什么计时器不工作? – SLaks

+0

您是否考虑过使用API​​来获取鼠标按钮的当前状态? –

回答

2

使用一个BackgroundWorker。适合您的问题。

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

+0

当你说“停止”,你的意思是“[取消](http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.cancelasync.aspx)”? – svick

+0

sry表示RunWorkerAsync&CancelAsync – jrb

+0

简单而好的解决方案。 Tnx;) – Elfoc

0

如果使用定时器不起作用,则需要在不同的线程上发送数据,并从MouseUp处理程序发出该线程的信号。

0

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

我建议使用Reactive Extensions

编辑:

它可能会稍微过度设计(我不知道如果这是唯一的方案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); 

使用LINQ - 接收查询和过滤事件

var leftMouseDown = from evt in mouseDown 
    where evt.LeftButton == MouseButtonState.Pressed 
    select evt; 

和使用的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 => { ... }); 

从代码here略微修改。