空闲时间后隐藏鼠标光标

Sup*_*Tux 12 c#

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

Sam*_*uel 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的 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;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


Eri*_*bal 12

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

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)