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