예제 #1
0
        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));
            }
        }
예제 #2
0
        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;
            }
        }