空闲时间后隐藏鼠标光标

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

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

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

如果您使用的是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; } } } 

需要考虑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; } }