private long Listener( HookCode nCode, WindowsMessage wParam, MsLlHookStruct lParam) { if (this.actions.TryGetValue(wParam, out var action)) { this.sync.Post(state => action(), null); } return(User32.CallNextHookEx( nCode: nCode, wParam: wParam, lParam: lParam)); }
//build mouse command private static void BuildMouseCommand(IntPtr lParam, MouseMessages mouseMessage) { MsLlHookStruct hookStruct = (MsLlHookStruct)Marshal.PtrToStructure(lParam, typeof(MsLlHookStruct)); string mouseEventClickType; switch (mouseMessage) { case MouseMessages.WmLButtonDown: mouseEventClickType = "Left Down"; break; case MouseMessages.WmLButtonUp: mouseEventClickType = "Left Up"; break; case MouseMessages.WmMButtonDown: mouseEventClickType = "Middle Down"; break; case MouseMessages.WmMButtonUp: mouseEventClickType = "Middle Up"; break; case MouseMessages.WmMouseMove: mouseEventClickType = "None"; if (_lastMouseMove.ElapsedMilliseconds >= _msResolution) { _lastMouseMove.Restart(); } else { return; } break; case MouseMessages.WmRButtonDown: mouseEventClickType = "Right Down"; break; case MouseMessages.WmRButtonUp: mouseEventClickType = "Right Up"; break; default: return; } //return if we do not want to capture mouse moves if ((!_performMouseMoveCapture) && (mouseEventClickType == "None")) { return; } //return if we do not want to capture mouse clicks if ((!_performMouseClickCapture) && (mouseEventClickType != "None")) { return; } if ((GeneratedCommands.Count > 1) && (GeneratedCommands[GeneratedCommands.Count - 1] is SendMouseMoveCommand) && mouseEventClickType != "None" && _stopWatch.ElapsedMilliseconds <= 500 && hookStruct.Pt.X == _lastClickHookStruct.Pt.X && hookStruct.Pt.Y == _lastClickHookStruct.Pt.Y) { var lastCreatedMouseCommand = (SendMouseMoveCommand)GeneratedCommands[GeneratedCommands.Count - 1]; switch ((GeneratedCommands[GeneratedCommands.Count - 1] as SendMouseMoveCommand).v_MouseClick) { case "Left Down": if (mouseEventClickType == "Left Up") { lastCreatedMouseCommand.v_MouseClick = "Left Click"; } break; case "Middle Down": if (mouseEventClickType == "Middle Up") { lastCreatedMouseCommand.v_MouseClick = "Middle Click"; } break; case "Right Down": if (mouseEventClickType == "Right Up") { lastCreatedMouseCommand.v_MouseClick = "Right Click"; } break; case "Left Click": if (mouseEventClickType == "Left Down") { lastCreatedMouseCommand.v_MouseClick = "Left Double Click"; } break; default: break; } } else { //build a pause command to track pause since last command BuildPauseCommand(); //define new mouse command var mouseMove = new SendMouseMoveCommand { v_XMousePosition = hookStruct.Pt.X.ToString(), v_YMousePosition = hookStruct.Pt.Y.ToString(), v_MouseClick = mouseEventClickType }; if (mouseEventClickType != "None") { IntPtr winHandle = WindowFromPoint(hookStruct.Pt); _ = GetWindowText(winHandle, _buffer, _buffer.Capacity); var windowName = _buffer.ToString(); mouseMove.v_Comment = "Clicked On Window: " + windowName; } GeneratedCommands.Add(mouseMove); } _lastClickHookStruct = hookStruct; }
//build mouse command private static void BuildMouseCommand(IntPtr lParam, _mouseMessages mouseMessage) { string mouseEventClickType = string.Empty; switch (mouseMessage) { case _mouseMessages.WmLButtonDown: mouseEventClickType = "Left Down"; break; case _mouseMessages.WmLButtonUp: mouseEventClickType = "Left Up"; break; case _mouseMessages.WmMouseMove: mouseEventClickType = "None"; if (_lastMouseMove.ElapsedMilliseconds >= _msResolution) { _lastMouseMove.Restart(); } else { return; } break; case _mouseMessages.WmRButtonDown: mouseEventClickType = "Right Down"; break; case _mouseMessages.WmRButtonUp: mouseEventClickType = "Right Up"; break; default: return; } ////return if non matching event //if (mouseEventClickType == string.Empty) // return; //return if we do not want to capture mouse moves if ((!_performMouseMoveCapture) && (mouseEventClickType == "None")) { return; } //return if we do not want to capture mouse clicks if ((!_performMouseClickCapture) && (mouseEventClickType != "None")) { return; } //build a pause command to track pause since last command BuildPauseCommand(); //define new mouse command MsLlHookStruct hookStruct = (MsLlHookStruct)Marshal.PtrToStructure(lParam, typeof(MsLlHookStruct)); var mouseMove = new SendMouseMoveCommand { v_XMousePosition = hookStruct.Pt.X.ToString(), v_YMousePosition = hookStruct.Pt.Y.ToString(), v_MouseClick = mouseEventClickType }; if (mouseEventClickType != "None") { IntPtr winHandle = WindowFromPoint(hookStruct.Pt); int length = GetWindowText(winHandle, _buffer, _buffer.Capacity); var windowName = _buffer.ToString(); mouseMove.v_Comment = "Clicked On Window: " + windowName; } GeneratedCommands.Add(mouseMove); }