2011-10-10 78 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略微修改。