WPF- how to create a kind of a screensaver (with timer) - c#

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.

Related

How to check when the timer tick event occurs

I need to make a splash screen that is visible for 5000 milliseconds before closing. I pass in 5000 to my SplashScreen form constructor and set timer1.Interval = time. I can't seem to find a straightforward answer online and I don't have much experience with timers. I assume that I need to show the splash screen, start the timer, check for when timer1.Tick occurs, and close the form but I don't know the syntax on how to do that.
private void Form1_Load(object sender, EventArgs e)
{
SplashScreen splash = new SplashScreen(5000, appLogo, "Text Editor", "Copyright (c) 2020", "John Doe");
splash.timer1.Enabled = true;
splash.ShowDialog();
splash.timer1.Start();
// Wait for Tick event to occur.....
splash.Close();
}
In your SplashScreen form, you need to define the Tick event:
timer1.Tick += new EventHandler(CloseForm);
That calls a method to close the form:
private void CloseForm(Object source, EventArgs eventArgs)
{
this.Close();
}

button click every interval c#

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.

DispatcherTimer loses time while I'm dragging its Window

I'm trying to build a simple timeout with C# WPF.
public void start(){
answerTimer = new DispatcherTimer();
answerTimer.Tick += new EventHandler(answerTimer_Tick);
answerTimer.Interval = new TimeSpan(0,0,0,0,10);
answerTimer.Start();
}
private void answerTimer_Tick(object sender, EventArgs e)
{
...
}
This works but if I move the Window dragging it, the countdown stops and restart when I drop the Window.... how to avoid it?
Thanks.
try to put this
DispatcherTimer timer = new DispatcherTimer(DispatcherPriority.Render);

Raise event after 30 seconds of no user interaction

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();
}

How to let System.Windows.Forms.Timer to run the Tick handler immediately when starting?

The Timer following is System.Windows.Forms.Timer
C# Code:
Timer myTimer = new Timer();
myTimer.Interval = 10000;
myTimer.Tick += new EventHandler(doSth);
myTimer.Start();
The timer will doSth every 10 seconds, but how to let it doSth immediately when starting?
I tried to create a custom timer which extends Timer, but I can't override the Start method.
For now, my code is:
myTimer.Start();
doSth(this, null);
I don't think it's good. How to improve it?
It's perfect. Don't change a thing.
I'm not sure of your exact requirements but why not put the code inside your timer callback inside another method?
e.g.
private void tmrOneSec_Tick(object sender, System.EventArgs e)
{
DoTimerStuff();
}
private void DoTimerStuff()
{
//put the code that was in your timer callback here
}
So that way you can just call DoTimerStuff() when your application starts up.
The timer has to have form level scope, and it's not clear that you have that. I whipped up a small example out of curiosity and it is working for me:
private void Form1_Load(object sender, EventArgs e)
{
txtLookup.Text = "test";
DoSomething();
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
DoSomething();
}
private void DoSomething()
{
txtLookup.Text += "ticking";
}
Every 10 seconds it appends another "ticking" to the text in the textbox.
You say,
"The timer will doSth every 10 seconds, but how to let it doSth immediately when starting?"
I say, call doSth immediately before calling the timer's start method

Categories