在軟件開發中有時會有等待一段時間無人操作后隱藏鼠標,可能原因大致如下:
1.為了安全性,特別是那些需要用到用戶名和密碼登錄服務端的程序,常常考慮長期無人操作,程序自動跳轉到用戶登錄界面;
2.軟件為了更好的播放效果,需要隱藏鼠標。
這里寫的是第二種情況,wpf做播放時,需要隱藏鼠標。
思路是:假如3s鼠標不動則隱藏,設計了計時器的間隔時間為1s,並添加鼠標沒移動的計數器,計數器達到3才執行程序。實現是這樣的:每隔1s檢測鼠標是否移動,如果不移動則計數器加1,如果中途鼠標移動,則計數器清零,要達到計數器計數為3,則要3次鼠標檢測中鼠標都不移動,這樣從鼠標停止移動,到計數器達到3,剛好是3s,能夠達到3s鼠標不動則隱藏程序執行;
一、封裝好的監視鼠標移動的類文件:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Runtime.InteropServices; namespace EBS.Common { public class MouseMonitorHelper { private static Point mousePosition; //鼠標的位置 public static int CheckCount; //檢測鼠標位置的次數 //判斷鼠標是否移動 public static bool HaveUsedTo() { Point point = GetMousePoint(); if (point == mousePosition) return false; mousePosition = point; return true; } [StructLayout(LayoutKind.Sequential)] private struct MPoint { public int X; public int Y; public MPoint(int x, int y) { this.X = x; this.Y = y; } } [DllImport("user32.dll", CharSet = CharSet.Auto)] private static extern bool GetCursorPos(out MPoint mpt); // 獲取當前屏幕鼠標位置 public static Point GetMousePoint() { MPoint mpt = new MPoint(); GetCursorPos(out mpt); Point p = new Point(mpt.X, mpt.Y); return p; } } }
二、程序中調用Timer事件:

private DispatcherTimer Timer_MouseMove; private void Window_Loaded(object sender, RoutedEventArgs e) { // 設置鼠標隱藏、顯示 this.Timer_MouseMove = new DispatcherTimer(); this.Timer_MouseMove.Tick +=new EventHandler(Timer_MouseMove_Tick); this.Timer_MouseMove.Interval = new TimeSpan(0, 0, 1); this.Timer_MouseMove.Start(); } private void Timer_MouseMove_Tick(object sender, EventArgs e) { try { if (!MouseMonitorHelper.HaveUsedTo()) { MouseMonitorHelper.CheckCount++; if (MouseMonitorHelper.CheckCount == 3) { MouseMonitorHelper.CheckCount = 0; // 關閉按鈕隱藏、鼠標隱藏 this.cnsExist.Visibility = Visibility.Hidden; Mouse.OverrideCursor = Cursors.None; } } else MouseMonitorHelper.CheckCount = 0; } catch { throw new NotImplementedException(); } } private void DockPanel_MouseMove(object sender, MouseEventArgs e) { this.cnsExist.Visibility = Visibility.Visible; Mouse.OverrideCursor = Cursors.Arrow;
另外如果有設計到鼠標焦點的情況,請參考WPF程序長時間無人操作