C#循环,当鼠标按下按钮按下
问题描述:
我想使用循环而左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事件永远不会火。
那么如何使它正常工作?
答
如果使用定时器不起作用,则需要在不同的线程上发送数据,并从MouseUp
处理程序发出该线程的信号。
答
要做到这一点的正确方法是将rs-232发送函数放入单独的线程中,以便UI保持响应,然后在鼠标事件更改时启动和停止它。
本页面可能是有用的:
答
这些场景实现起来非常复杂 - 请参阅您的处理程序和用于存储状态的布尔变量。
我建议使用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略微修改。
你为什么要这样? – TJHeuvel
为什么计时器不工作? – SLaks
您是否考虑过使用API来获取鼠标按钮的当前状态? –