空闲时间后隐藏鼠标光标

时间:2009-04-13 18:58:48

标签: c#

我希望在空闲时间后隐藏鼠标光标,当我移动鼠标时它会显示出来。我试图使用计时器,但它不能正常工作。有谁能够帮我?请!

3 个答案:

答案 0 :(得分:22)

如果您使用的是WinForms并且只能部署在Windows机器上,那么使用user32 GetLastInputInfo来处理鼠标和键盘空闲非常容易。

public static class User32Interop
{
  public static TimeSpan GetLastInput()
  {
    var plii = new LASTINPUTINFO();
    plii.cbSize = (uint)Marshal.SizeOf(plii);

    if (GetLastInputInfo(ref plii))
      return TimeSpan.FromMilliseconds(Environment.TickCount - plii.dwTime);
    else
      throw new Win32Exception(Marshal.GetLastWin32Error());
  }

  [DllImport("user32.dll", SetLastError = true)]
  static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);

  struct LASTINPUTINFO
  {
    public uint cbSize;
    public uint dwTime;
  }
}

然后在Form

public partial class MyForm : Form
{
  Timer activityTimer = new Timer();
  TimeSpan activityThreshold = TimeSpan.FromMinutes(2);
  bool cursorHidden = false;

  public Form1()
  {
    InitializeComponent();

    activityTimer.Tick += activityWorker_Tick;
    activityTimer.Interval = 100;
    activityTimer.Enabled = true;
  }

  void activityWorker_Tick(object sender, EventArgs e)
  {
    bool shouldHide = User32Interop.GetLastInput() > activityThreshold;
    if (cursorHidden != shouldHide)
    {
      if (shouldHide)
        Cursor.Hide();
      else
        Cursor.Show();

      cursorHidden = shouldHide;
    }
  }
}

答案 1 :(得分:11)

这是一个如何做的人为例子。你可能有一些错过的逻辑覆盖了游标的可见性:

public partial class Form1 : Form
{
    public TimeSpan TimeoutToHide { get; private set; }
    public DateTime LastMouseMove { get; private set; }
    public bool IsHidden { get; private set; }

    public Form1()
    {
        InitializeComponent();
        TimeoutToHide = TimeSpan.FromSeconds(5);
        this.MouseMove += new MouseEventHandler(Form1_MouseMove);
    }

    void Form1_MouseMove(object sender, MouseEventArgs e)
    {
        LastMouseMove = DateTime.Now;

        if (IsHidden) 
        { 
            Cursor.Show(); 
            IsHidden = false; 
        }
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        TimeSpan elaped = DateTime.Now - LastMouseMove;
        if (elaped >= TimeoutToHide && !IsHidden)
        {
            Cursor.Hide();
            IsHidden = true;
        }
    }
}

答案 2 :(得分:4)

需要考虑Environment.Tickcount为负数:

public static class User32Interop
{

    public static TimeSpan GetLastInput()
    {
        var plii = new LASTINPUTINFO();
        plii.cbSize = (uint)Marshal.SizeOf(plii);

        if (GetLastInputInfo(ref plii))
        {
            int idleTime = unchecked(Environment.TickCount - (int)plii.dwTime);
            return TimeSpan.FromMilliseconds(idleTime);
        }
        else
            throw new Win32Exception(Marshal.GetLastWin32Error());
    }

    [DllImport("user32.dll", SetLastError = true)]
    static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);

    struct LASTINPUTINFO
    {
        public uint cbSize;
        public uint dwTime;
    }
}