private static void GenerateMouseSequence(MouseButtonEventArgs args, IntPtr hitWindow, Native.Platform.Structs.Point screenPoint, int hitTestResult) { var isHitTestNonClient = IsHitTestResultNonClient(hitTestResult); var messageFromMouseEvent = GetWindowsMessageFromMouseEvent(args, isHitTestNonClient); if (messageFromMouseEvent == 0) { return; } var ancestor = User32.GetAncestor(hitWindow, 2); var lParam = NativeMethods.MakeParam(hitTestResult, messageFromMouseEvent); bool flag1; bool flag2; switch (User32.SendMessage(hitWindow, 33, ancestor, lParam) .ToInt32()) { case 1: flag1 = flag2 = true; break; case 2: flag1 = true; flag2 = false; break; case 3: flag1 = false; flag2 = true; break; default: flag1 = flag2 = false; break; } if (flag1) { User32.SetActiveWindow(ancestor); } if (!flag2) { return; } if (isHitTestNonClient) { User32.SendMessage(hitWindow, messageFromMouseEvent, new IntPtr(hitTestResult), NativeMethods.MakeParam(screenPoint.X, screenPoint.Y)); } else { Native.Platform.Structs.Point point = screenPoint; User32.ScreenToClient(hitWindow, ref point); User32.SendMessage(hitWindow, messageFromMouseEvent, NativeMethods.MakeParam(PressedMouseButtons, GetXButtonWparam(args)), NativeMethods.MakeParam(point.X, point.Y)); } }
private static void Current_PostProcessInput(object sender, ProcessInputEventArgs e) { if (_isSpoofingInput) { return; } if (!(e.StagingItem.Input is MouseButtonEventArgs input) || input.RoutedEvent != Mouse.PreviewMouseDownOutsideCapturedElementEvent || input.Handled) { return; } int messagePos = User32.GetMessagePos(); var point = new Native.Platform.Structs.Point { X = NativeMethods.GetXlParam(messagePos), Y = NativeMethods.GetYlParam(messagePos) }; var num = User32.WindowFromPoint(point); if (!User32.IsWindow(num)) { return; } if ((int)User32.GetWindowThreadProcessId(num, out var _) != (int)Kernel32.GetCurrentThreadId()) { return; } try { _isSpoofingInput = true; var hwndSource = HwndSource.FromHwnd(num); var hitTestResult = HitTest(num); if (hwndSource != null && !IsHitTestResultNonClient(hitTestResult)) { return; } Mouse.Capture(null); GenerateMouseSequence(input, num, point, hitTestResult); } finally { _isSpoofingInput = false; } }