c# - Wiggling the mouse


Translate

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.


所有的回答
  • Translate

    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); };
            timer.Start();
            Application.Run();
        }
    }
    

  • Translate

    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.


  • Translate

    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.


  • Translate

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

    public Form1()
    {
        InitializeComponent();
        Timer Every4Minutes = new Timer();
        Every4Minutes.Interval = 10;
        Every4Minutes.Tick += new EventHandler(MoveNow);
        Every4Minutes.Start();
    }
    
    void MoveNow(object sender, EventArgs e)
    {
        Cursor.Position = new Point(Cursor.Position.X - 1, Cursor.Position.Y - 1);
    }