我在c#中的计时器中遇到鼠标点击事件的问题。
我的计时器间隔为100并且设置为True,我想每100个刻度进行操作并识别点击的类型。我想在按下鼠标时每100个刻度播放一次动作,但是这个只播放一次。 编辑:我不想要启用/禁用时间。
private void timer1_Tick(object sender, MouseEventArgs e)
{
if (MouseButtons == MouseButtons.Left)
{
//Action...
}
if (MouseButtons == MouseButtons.Right)
{
//Action...
}
}
答案 0 :(得分:1)
100个滴答是0.01毫秒,Interval是一个整数,所以我在这个测试中使用秒。
此网络表单将检测最后一次单击的鼠标按钮,并根据上次单击的鼠标按钮更改计时器标记事件中的计时器间隔。我还添加了视觉指示标签:
public partial class Form1 : Form
{
Timer t;
MouseButtons LastMouseButtonClicked;
Label lblStatus;
DateTime previousTick;
TimeSpan elapsed;
public Form1()
{
InitializeComponent();
lblStatus = new Label()
{
Text = "No click since tick."
,
Width = 1000
};
this.Controls.Add(lblStatus);
t = new Timer();
//A single tick represents one hundred nanoseconds or one ten-millionth of a second. There are 10,000 ticks in a millisecond, or 10 million ticks in a second.
//t.Interval = (int)(100 / TimeSpan.TicksPerMillisecond);//0.01 ms
t.Interval = 1000;
t.Tick += T_Tick;
t.Enabled = true;
this.MouseClick += Form1_MouseClick;
elapsed = TimeSpan.Zero;
}
private void T_Tick(object sender, EventArgs e)
{
if (elapsed == TimeSpan.Zero)
{
elapsed += new TimeSpan(0, 0, 0, 0, 1);
}
else
{
elapsed += DateTime.Now - previousTick;
}
switch (LastMouseButtonClicked)
{
case MouseButtons.Left:
//Action...
lblStatus.Text = "MouseButtons.Left " + elapsed.Seconds;
break;
case MouseButtons.Right:
//Action...
lblStatus.Text = "MouseButtons.Right " + elapsed.Seconds;
break;
default:
lblStatus.Text = "No click since tick. " + elapsed.Seconds;
break;
}
previousTick = DateTime.Now;
}
private void Form1_MouseClick(object sender, MouseEventArgs e)
{
switch (e.Button)
{
case MouseButtons.Left:
LastMouseButtonClicked = e.Button;
t.Interval = 1000;
break;
case MouseButtons.Right:
LastMouseButtonClicked = e.Button;
t.Interval = 3000;
break;
}
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
根据鼠标单击,定时器间隔更改为1秒或3秒。您还可以在鼠标单击事件中更改间隔以简化它。
以下是一个例子:
function capitalize(name) {
capitalizedName = '';
let nameSplit = name.split(/\W/g);
let symbols = name.match(/\W/g);
for(let i = 0; i< nameSplit.length; i++) {
capitalizedName += nameSplit[i][0].toUpperCase() +
nameSplit[i].slice(1)
if(i < nameSplit.length -1) capitalizedName += symbols[i];
}
return capitalizedName
}
答案 1 :(得分:0)
如果你真的很懒,不想在我的评论中阅读答案或重做逻辑,你可以修改你的代码(如果这是你的意图):
private void timer1_Tick(object sender, EventArgs e)
{
if (MouseButtons == MouseButtons.Left)
{
//Action...
}
if (MouseButtons == MouseButtons.Right)
{
//Action...
}
}
MouseButtons,如Control.MouseButtons
这是用于在timer_tick中获取鼠标按钮状态的方法,根据您的请求,无需鼠标单击事件。
更新您能否提及您使用的是什么类型的计时器?他们都有不同的行为和陷阱。 System.Windows.Forms.Timer,System.Timers.Timer和System.Threading.Timer。
我问,因为有时会有一个AutoReset属性,如果你想要发生多个timer_tick,你应该设置为true。我可能是错的,但这听起来像你所描述的,所以值得一试!
@Soenhay:我怀疑OP想要在按住鼠标的同时“循环并执行每个t的动作”。据我所知。 MouseUp之后的MouseClick触发器。您可以修改代码以使用MouseButtons(静态WinForms奇怪)来检查按钮的状态。
@OP:如果没有你发布额外的代码,我没有办法让任何人帮助你进一步帮助你,除了用随机代码在黑暗中刺伤。现在你至少有3个类似于你需要的例子,关于静态MouseButtons类的新知识,所以我认为你可以而且应该从这里开始,否则你什么都不学习!