Скрыть курсор мыши после простоя

Я хочу скрыть свой указатель мыши после простоя, и он появится при перемещении мыши. Я пытался использовать таймер, но он не работал. Кто-нибудь может мне помочь? Пожалуйста!

Ответ 1

Вот надуманный пример того, как это сделать. Вероятно, у вас была недостающая логика, которая перекрывала видимость курсора:

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

Если вы используете 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;
    }
  }
}

Ответ 3

Необходимо учитывать окружение. Значение процента отрицательно:

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