public void MKSwitch_MouseInput(object sender, UserMouseEventArgs e) { var user = this.users.FirstOrDefault(u => u.Id == e.UserId); if (user != null) { int x = CalculateAbsoluteCoordinateX(e.X + user.XOffset); int y = CalculateAbsoluteCoordinateY(e.Y + user.YOffset); var hWindow = user.ProccessWindowHandle; SetForegroundWindow(hWindow); //SetActiveWindow(hWindow); //SetFocus(hWindow); //SetCapture(hWindow); //SetCursorPos(x, y); SendInputEnums.MOUSEEVENTF lastInputFlags = SendInputEnums.MOUSEEVENTF.MOVE | SendInputEnums.MOUSEEVENTF.ABSOLUTE; if (user.LastButton == e.Button && user.LastButtonState == UserMouseState.Down) { //if last event for this user was with button state down, we need to repeat last send input //Cursor must be brought back to last position (coordinates) and send mouse down input and then send current input int lastX = CalculateAbsoluteCoordinateX(user.LastPositionX + user.XOffset); int lastY = CalculateAbsoluteCoordinateY(user.LastPositionY + user.YOffset); switch (user.LastButton) { case UserMouseButton.Left: lastInputFlags = lastInputFlags | SendInputEnums.MOUSEEVENTF.LEFTDOWN; break; case UserMouseButton.Middle: lastInputFlags = lastInputFlags | SendInputEnums.MOUSEEVENTF.MIDDLEDOWN; break; case UserMouseButton.Right: lastInputFlags = lastInputFlags | SendInputEnums.MOUSEEVENTF.RIGHTDOWN; break; default: break; } var pLastInputs = new[] { new SendInputStructs.INPUT() { type = (int)SendInputEnums.InputType.INPUT_MOUSE, U = new SendInputStructs.InputUnion { mi = new SendInputStructs.MOUSEINPUT() { dx = lastX, dy = lastY, dwFlags = lastInputFlags } } } }; SendInput((uint)pLastInputs.Length, pLastInputs, SendInputStructs.INPUT.Size); } //send current input SendInputEnums.MOUSEEVENTF flags = SendInputEnums.MOUSEEVENTF.MOVE | SendInputEnums.MOUSEEVENTF.ABSOLUTE; switch (e.State) { case UserMouseState.Down: switch (e.Button) { case UserMouseButton.Left: flags = flags | SendInputEnums.MOUSEEVENTF.LEFTDOWN; break; case UserMouseButton.Middle: flags = flags | SendInputEnums.MOUSEEVENTF.MIDDLEDOWN; break; case UserMouseButton.Right: flags = flags | SendInputEnums.MOUSEEVENTF.RIGHTDOWN; break; default: break; } break; case UserMouseState.Up: switch (e.Button) { case UserMouseButton.Left: flags = flags | SendInputEnums.MOUSEEVENTF.LEFTUP; break; case UserMouseButton.Middle: flags = flags | SendInputEnums.MOUSEEVENTF.MIDDLEUP; break; case UserMouseButton.Right: flags = flags | SendInputEnums.MOUSEEVENTF.RIGHTUP; break; default: break; } break; default: break; } var pInputs = new[] { new SendInputStructs.INPUT() { type = (int)SendInputEnums.InputType.INPUT_MOUSE, U = new SendInputStructs.InputUnion { mi = new SendInputStructs.MOUSEINPUT() { dx = x, dy = y, dwFlags = flags } } } }; SendInput((uint)pInputs.Length, pInputs, SendInputStructs.INPUT.Size); if (e.State == UserMouseState.Down) { //if button state in send input is down, we need to send one more input with mouse up so we can release mouse down handling for other windows //send input mouse button up so we can free mouse down handling for other windows SendInputEnums.MOUSEEVENTF flagsUp = SendInputEnums.MOUSEEVENTF.MOVE | SendInputEnums.MOUSEEVENTF.ABSOLUTE; switch (e.Button) { case UserMouseButton.Left: flagsUp = flagsUp | SendInputEnums.MOUSEEVENTF.LEFTUP; break; case UserMouseButton.Middle: flagsUp = flagsUp | SendInputEnums.MOUSEEVENTF.MIDDLEUP; break; case UserMouseButton.Right: flagsUp = flagsUp | SendInputEnums.MOUSEEVENTF.RIGHTUP; break; default: break; } pInputs = new[] { new SendInputStructs.INPUT() { type = (int)SendInputEnums.InputType.INPUT_MOUSE, U = new SendInputStructs.InputUnion { mi = new SendInputStructs.MOUSEINPUT() { dx = x, dy = y, dwFlags = flagsUp } } } }; SendInput((uint)pInputs.Length, pInputs, SendInputStructs.INPUT.Size); } user.LastButton = e.Button; user.LastButtonState = e.State; user.LastPositionX = e.X; user.LastPositionY = e.Y; } }
public void MKSwitch_MouseInput(object sender, UserMouseEventArgs e) { var user = this.users.FirstOrDefault(u => u.Id == e.UserId); if(user != null) { int x = CalculateAbsoluteCoordinateX(e.X + user.XOffset); int y = CalculateAbsoluteCoordinateY(e.Y + user.YOffset); var hWindow = user.ProccessWindowHandle; SetForegroundWindow(hWindow); //SetActiveWindow(hWindow); //SetFocus(hWindow); //SetCapture(hWindow); //SetCursorPos(x, y); SendInputEnums.MOUSEEVENTF lastInputFlags = SendInputEnums.MOUSEEVENTF.MOVE | SendInputEnums.MOUSEEVENTF.ABSOLUTE; if(user.LastButton == e.Button && user.LastButtonState == UserMouseState.Down) { //if last event for this user was with button state down, we need to repeat last send input //Cursor must be brought back to last position (coordinates) and send mouse down input and then send current input int lastX = CalculateAbsoluteCoordinateX(user.LastPositionX + user.XOffset); int lastY = CalculateAbsoluteCoordinateY(user.LastPositionY + user.YOffset); switch (user.LastButton) { case UserMouseButton.Left: lastInputFlags = lastInputFlags | SendInputEnums.MOUSEEVENTF.LEFTDOWN; break; case UserMouseButton.Middle: lastInputFlags = lastInputFlags | SendInputEnums.MOUSEEVENTF.MIDDLEDOWN; break; case UserMouseButton.Right: lastInputFlags = lastInputFlags | SendInputEnums.MOUSEEVENTF.RIGHTDOWN; break; default: break; } var pLastInputs = new[] { new SendInputStructs.INPUT() { type = (int)SendInputEnums.InputType.INPUT_MOUSE, U = new SendInputStructs.InputUnion { mi = new SendInputStructs.MOUSEINPUT() { dx = lastX, dy = lastY, dwFlags = lastInputFlags } } } }; SendInput((uint)pLastInputs.Length, pLastInputs, SendInputStructs.INPUT.Size); } //send current input SendInputEnums.MOUSEEVENTF flags = SendInputEnums.MOUSEEVENTF.MOVE | SendInputEnums.MOUSEEVENTF.ABSOLUTE; switch(e.State) { case UserMouseState.Down: switch(e.Button) { case UserMouseButton.Left: flags = flags | SendInputEnums.MOUSEEVENTF.LEFTDOWN; break; case UserMouseButton.Middle: flags = flags | SendInputEnums.MOUSEEVENTF.MIDDLEDOWN; break; case UserMouseButton.Right: flags = flags | SendInputEnums.MOUSEEVENTF.RIGHTDOWN; break; default: break; } break; case UserMouseState.Up: switch(e.Button) { case UserMouseButton.Left: flags = flags | SendInputEnums.MOUSEEVENTF.LEFTUP; break; case UserMouseButton.Middle: flags = flags | SendInputEnums.MOUSEEVENTF.MIDDLEUP; break; case UserMouseButton.Right: flags = flags | SendInputEnums.MOUSEEVENTF.RIGHTUP; break; default: break; } break; default: break; } var pInputs = new[] { new SendInputStructs.INPUT() { type = (int)SendInputEnums.InputType.INPUT_MOUSE, U = new SendInputStructs.InputUnion { mi = new SendInputStructs.MOUSEINPUT() { dx = x, dy = y, dwFlags = flags } } } }; SendInput((uint)pInputs.Length, pInputs, SendInputStructs.INPUT.Size); if(e.State == UserMouseState.Down) { //if button state in send input is down, we need to send one more input with mouse up so we can release mouse down handling for other windows //send input mouse button up so we can free mouse down handling for other windows SendInputEnums.MOUSEEVENTF flagsUp = SendInputEnums.MOUSEEVENTF.MOVE | SendInputEnums.MOUSEEVENTF.ABSOLUTE; switch (e.Button) { case UserMouseButton.Left: flagsUp = flagsUp | SendInputEnums.MOUSEEVENTF.LEFTUP; break; case UserMouseButton.Middle: flagsUp = flagsUp | SendInputEnums.MOUSEEVENTF.MIDDLEUP; break; case UserMouseButton.Right: flagsUp = flagsUp | SendInputEnums.MOUSEEVENTF.RIGHTUP; break; default: break; } pInputs = new[] { new SendInputStructs.INPUT() { type = (int)SendInputEnums.InputType.INPUT_MOUSE, U = new SendInputStructs.InputUnion { mi = new SendInputStructs.MOUSEINPUT() { dx = x, dy = y, dwFlags = flagsUp } } } }; SendInput((uint)pInputs.Length, pInputs, SendInputStructs.INPUT.Size); } user.LastButton = e.Button; user.LastButtonState = e.State; user.LastPositionX = e.X; user.LastPositionY = e.Y; } }