做 WPF和winform的时候,可以在界面上设置鼠标移动事件来检测鼠标移动,如果项目为后期改造这样做的话改动量很大,今天通过另外一种后台调用windows api的方式进行快速捕获和触发,提高开发效率分享给大家。

/// /// 鼠标移动帮助类/// public class MouseMoveHelper:IDisposable{public MouseMoveHelper(){}public void Dispose(){try{if (mousePositionTimer != null){mousePositionTimer.Stop();deactivatedTimer.Stop();mousePositionTimer = null;deactivatedTimer = null;}}catch (Exception ex){}}public Action<NoOperationEvent> OK;#region 监测是否有用户操作private DispatcherTimer mousePositionTimer;//长时间不操作该程序退回到登录界面的计时器private Point mousePosition;//鼠标的位置private int checkCount = 0; //检测鼠标位置的次数private DispatcherTimer deactivatedTimer; //当焦点不在此程序上时计时器public void Start(){mousePosition = GetMousePoint();//获取鼠标坐标if (mousePositionTimer==null){mousePositionTimer = new DispatcherTimer();mousePositionTimer.Tick += new EventHandler(MousePositionTimedEvent);mousePositionTimer.Interval = new TimeSpan(0, 0, 1); //每隔10秒检测一次鼠标位置是否变动}mousePositionTimer.Start();if (deactivatedTimer == null){deactivatedTimer = new DispatcherTimer();deactivatedTimer.Tick += new EventHandler(deactivatedTimer_Tick);deactivatedTimer.Interval = new TimeSpan(0, 0, 10); //如果焦点不在此程序中时,过10s程序自动重启}}bool isMoved = true;// 倒计时延迟数int maxDelayCount = 1;private void MousePositionTimedEvent(object sender, EventArgs e){if (!HaveUsedTo()){checkCount++;//检测到鼠标没移动,checkCount + 1if (checkCount == maxDelayCount){checkCount = 0;//长时间无人操作if (isMoved){isMoved = false;OK?.Invoke(new NoOperationEvent() { Message = "检测到无鼠标移动", CurrentMouseState = NoOperationEvent.MouseState.standstill });}}}else{OK?.Invoke(new NoOperationEvent() { Message = "检测到鼠标移动", CurrentMouseState = NoOperationEvent.MouseState.move });checkCount = 0; //检测到鼠标移动,重新计数isMoved=true;}}private void deactivatedTimer_Tick(object sender, EventArgs e){deactivatedTimer.Stop();//长时间无人操作//Messenger.Default.Send("focus", "DoFocus");}//判断鼠标是否移动private 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 Point GetMousePoint(){MPoint mpt = new MPoint();GetCursorPos(out mpt);Point p = new Point(mpt.X, mpt.Y);return p;}#endregion}

程序调用

var MouseMoveHelper = new MouseMoveHelper();MouseMoveHelper.OK = CheckMouseState; MouseMoveHelper.Start();

一般在顶级父类里面初始化的时候进行处理即可