In form there is a timer and I want disable timer.tick when form scrolling and a few seconds after that again timer be enabled. How it is possible?
Best regards.
You do not need to stop the timer from ticking. You just need to prevent it from doing anything if someone has scrolled recently.
Write a timestamp each time a scroll occurs. You can do this by subscribing to the Scroll event.
DateTime _lastScrollTime = DateTime.MinValue;
void MyControl_Scroll(object sender ScrollEventArgs e)
{
_lastScrollTime = DateTime.Now;
}
Then in your timer event, check the timestamp to make sure nobody has scrolled recently before doing anything:
void Timer_Tick(object sender, EventArgs e)
{
if (_lastScrollTime > DateTime.Now.AddSeconds(-2)) return;
//Do timer stuff
}
Related
I am trying to present to operator timer 00:00 on the start button event ( that start my program - long time event ) I enabled the timer but it doesn't tick only when the event finished or if message box occur .
I am using C# form timer .
Any idea how to implement in C# timer during long event ? I think is related to threading timer ? Any Example ? Please help ! thanks
private void Timer_elapsed_Tick(object sender, EventArgs e)
{
timeSec++;
if(timeSec >= 60)
{
timeSec = 0;
timeMin++;
}
DrawTime();
}
private void DrawTime()
{
lbSec.Text = string.Format("{0:00}", timeSec);
lbMin.Text = string.Format("{0:00}", timeMin);
}
private void start_Click(object sender, EventArgs e)
{
timer_elapsed.Enabled = true;
//do some event (long time)
//timer not works during this event
}
// when the event finished timer works
I think timer control not associated with Tick event. check your your code form designer cs whether you configured wired events handlers correctly for "Timer_elapsed_Tick". this.timer_elapsed.Tick += new System.EventHandler(this.Timer_elapsed_Tick);
solutions:
1.To works with System.Timers.Timer and not the windows form timer .
2.Add on click event Application.DoEvents .
I do not know how to solve this problem:
I want in my WPF Application something like a screensaver which pops up (let's say after 20 seconds) if you do not interact with the program. I tried researching, but I did not find anything and I do not know how to start. Does anyone have any tips for me?
You can for example start DispacherTimer and reset it if person move mouse or click something. In event check is time's up start new window/popup/dialog modal with screensaver, if person move mouse or click in screensaver close it and back to previous window.
Something about DispacherTimer you can find here:
WPF Timer Like C# Timer
or here https://msdn.microsoft.com/en-gb/library/system.windows.threading.dispatchertimer%28v=vs.90%29.aspx
You can do something like this then all you have to do is just set a timmer in the app.cs that resets.
private DispatcherTimer _timer;
protected override void OnStartup(StartupEventArgs e)
{
_timer = new DispatcherTimer();
_timer.Tick += Timer_Tick;
_timer.Interval = new TimeSpan(0,0,0,20,0);
_timer.Start();
EventManager.RegisterClassHandler(typeof(Window),Window.MouseMoveEvent, new RoutedEventHandler(Reset_Timer));
EventManager.RegisterClassHandler(typeof(Window), Window.MouseDownEvent, new RoutedEventHandler(Reset_Timer));
EventManager.RegisterClassHandler(typeof(Window), Window.KeyDownEvent, new RoutedEventHandler(Reset_Timer));
}
private void Timer_Tick(object sender, EventArgs e)
{
MessageBox.Show("Ticked");
}
private void Reset_Timer(object sender, EventArgs e)
{
_timer.Interval = new TimeSpan(0,0,0,20,0);
}
This will reset the timer every time you move your mouse click your mouse or push any key in the window.
I have a button where I want to it to click every 5 seconds.
I also have another button where the first button will stop clicking.
This is the code so far I have
private void StartButton_Click(object sender, EventArgs e)
{
timer1.Enabled = true;
}
private void timer1_Tick(object sender, EventArgs e)
{
Timer timer = new Timer { Interval = 5000 };
timer.Start();
}
How do I go on about achieving this?
if the button will set timer start/stop called 'ControlButton', and another one called 'DoJobButton'. Setup a timer interval = 5000 like your code. and in's tick event have this code only
DoJobButton.PerformClick();
this will trigger DoJobButton button's click action.
and set timer enable/disable in ControlButton's click event.
I think this is enough for your goal.
I want to add functionality to my WinForms so that when it starts a counter starts which will be in hh:mm. I know this can be done using a timer. I have made a time label which displays the current time, but I don't know how to start the timer when the form is loaded. Is there any method or class for that?
Place Timer component to your form (drag it from ToolBox - it's imporant, because timer should be registered as form's component to be disposed correctly when form closes). Set timer's Interval property to 60000 (that's equal to one minute). And subscribe to Tick event:
void timer1_Tick(object sender, EventArgs e)
{
if (endTime < DateTime.Now)
{
MessageBox.Show("Time is out!");
timer1.Stop();
return;
}
timeLabel.Text = (endTime - DateTime.Now).ToString(#"hh\:mm");
}
On Form_Load event handler start timer and save countdown end time:
private DateTime endTime; // field to store end time
void Form1_Load(object sender, EventArgs e)
{
endTime = DateTime.Now.AddMinutes(120); // set countdown to 120 minutes
timer1.Start();
}
The creation of a timer is very simple and straight forward:
Timer t1 = new Timer();
t1.Interval = 100;
t1.Tick+=new EventHandler(t1_Tick);
t1.Start();
void t1_Tick(object sender, EventArgs e)
{
}
For more information see http://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.80).aspx
I'm programming a WPF application, and I'd like to raise an event if the user has not interacted with the program for 30 seconds. That is to say, no keyboard or/and mouse events.
The reason I want do do this is because I want to bring attention to the screen if a variable alertstate has been set to true.
I'm thinking of using something along the lines of BackgroundWorker but I really don't know how I can get the time a user has not interacted with the program. Can someone point me in the right direction?
I guess this question basically comes down to checking if a user has interacted with the screen. How do I do this?
One way you could do this is to use GetLastInputInfo. This information will give you the time elapsed (in ticks) since last user interaction on mouse/keyboard.
You can have information here :
http://www.pinvoke.net/default.aspx/user32.GetLastInputInfo
So have a timer which checks for the last time an interaction went on. If you need accuracy, you can either check each 5 second for example OR you can, when you see that idle is ongoing for y seconds (y<30), setup a one-time timer that will check for idle time after (30-y) seconds.
You need to record the last time the user moved the mouse or pressed a key and then check if that time is greater than your threshold.
So you need to add mouse move, mouse click and keyboard handlers to your application (this is Silverlight code so you might have to change namespaces etc.):
private void AttachEvents()
{
Application.Current.RootVisual.MouseMove += new MouseEventHandler(RootVisual_MouseMove);
Application.Current.RootVisual.KeyDown += new KeyEventHandler(RootVisual_KeyDown);
Application.Current.RootVisual.AddHandler(UIElement.MouseLeftButtonDownEvent, (MouseButtonEventHandler)RootVisual_MouseButtonDown, true);
Application.Current.RootVisual.AddHandler(UIElement.MouseRightButtonDownEvent, (MouseButtonEventHandler)RootVisual_MouseButtonDown, true);
}
Then in the handlers have code like this for the mouse move:
private void RootVisual_MouseMove(object sender, MouseEventArgs e)
{
timeOfLastActivity = DateTime.Now;
}
and a similar one for the KeyDown event handler.
You will have to set off a timer:
idleTimer = new DispatcherTimer();
idleTimer.Interval = TimeSpan.FromSeconds(1);
idleTimer.Tick += new EventHandler(idleTimer_Tick);
// Initialise last activity time
timeOfLastActivity = DateTime.Now;
Then in the tick event handler have something like this:
private void idleTimer_Tick(object sender, EventArgs e)
{
if (DateTime.Now > timeOfLastActivity.AddSeconds(30))
{
// Do your stuff
}
}
Use ComponentDispatcher.ThreadIdle and DispatcherTimer to achieve this.
DispatcherTimer timer;
public Window1()
{
InitializeComponent();
ComponentDispatcher.ThreadIdle += new EventHandler(ComponentDispatcher_ThreadIdle);
timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(30);
timer.Tick += new EventHandler(timer_Tick);
}
void timer_Tick(object sender, EventArgs e)
{
//Do your action here
timer.Stop();
}
void ComponentDispatcher_ThreadIdle(object sender, EventArgs e)
{
timer.Start();
}