Wiggling the mouse

OK. This is a bit of a vanity app, but I had a situation today at work where I was in a training class and the machine was set to lock every 10 minutes. Well, if the trainers got excited about talking - as opposed to changing slides - the machine would lock up.

I'd like to write a teeny app that has nothing but a taskbar icon that does nothing but move the mouse by 1 pixel every 4 minutes.

I can do that in 3 ways with Delphi (my strong language) but I'm moving to C# for work and I'd like to know the path of least resistance there.

5.08.2008 02:51:37
Have you tried Lubso's answer? Whilst it will wiggle the mouse, I'm not sure it will stop the screen-saver from kicking in!
Ray Hayes 20.09.2008 17:54:18
Wouldn't it be better to write a shortcut for enabling and disabling the screensaver?
metao 18.02.2009 07:37:49
This did work on windows XP using a password protected screen saver.
Bruce the Hoon 8.07.2009 22:09:16
Just tried it on XP in a corporate locked-down environment (enforced password) and it doesn't help.
Ray Hayes 20.11.2009 14:06:28

for C# 3.5

without notifyicon therefore you will need to terminate this application in task manager manually

using System;
using System.Drawing;
using System.Windows.Forms;

static class Program
    static void Main()
        Timer timer = new Timer();
        // timer.Interval = 4 minutes
        timer.Interval = (int)(TimeSpan.TicksPerMinute * 4 / TimeSpan.TicksPerMillisecond);
        timer.Tick += (sender, args) => { Cursor.Position = new Point(Cursor.Position.X + 1, Cursor.Position.Y + 1); };
5.08.2008 04:12:12
Lubos - I like it! I am going to modify it to alternate between moves so that after a day, the cursor will not be buried at the corner of the screen, but that's being picky - perhaps they would even like it that way. :) Thanks a lot for the fast, great answer!
Bruce the Hoon 5.08.2008 04:44:27
Would this actually work? From memory, the "timeout" for kicking in of the screen saver is done somewhere in the O/S to do with input. Moving the mouse-position doesn't take the same logical path, so the user hasn't actually reset the countdown!
Ray Hayes 20.09.2008 17:51:59

Something like this should work (though, you will want to change the interval).

public Form1()
    Timer Every4Minutes = new Timer();
    Every4Minutes.Interval = 10;
    Every4Minutes.Tick += new EventHandler(MoveNow);

void MoveNow(object sender, EventArgs e)
    Cursor.Position = new Point(Cursor.Position.X - 1, Cursor.Position.Y - 1);
5.12.2012 07:38:06

The "correct" way to do this is to respond to the WM_SYSCOMMAND message. In C# this looks something like this:

protected override void WndProc(ref Message m)
    // Abort screensaver and monitor power-down
    const int WM_SYSCOMMAND = 0x0112;
    const int SC_MONITOR_POWER = 0xF170;
    const int SC_SCREENSAVE = 0xF140;
    int WParam = (m.WParam.ToInt32() & 0xFFF0);

    if (m.Msg == WM_SYSCOMMAND &&
        (WParam == SC_MONITOR_POWER || WParam == SC_SCREENSAVE)) return;

    base.WndProc(ref m);

According to MSDN, if the screensaver password is enabled by policy on Vista or above, this won't work. Presumably programmatically moving the mouse is also ignored, though I have not tested this.

17.08.2008 20:29:35

When I work from home, I do this by tying the mouse cord to a desktop fan which oscillates left to right. It keeps the mouse moving and keeps the workstation from going to sleep.

21.05.2012 17:01:56