在Windows应用商店应用

时间:2015-06-08 17:22:40

标签: c# windows-store-apps sendinput

我正在尝试将WPF应用程序移植到Windows 8.1应用程序。在这个应用程序中,我使用SendInput来移动鼠标并在应用程序窗口的内部或外部执行不同类型的单击(左,右,双...)。 这是我导入非托管函数(以及一些结构)的方法:

internal static class NativeMethods
    {
        [DllImport("user32.dll", SetLastError = true)]
        internal static extern uint SendInput(uint nInputs, ref NativeStructs.Input pInputs, int cbSize);

    }

    internal static class NativeStructs
    {
        [StructLayout(LayoutKind.Sequential)]
        internal struct Input
        {
            public NativeEnums.SendInputEventType type;
            public MouseInput mouseInput;
        }

        [StructLayout(LayoutKind.Sequential)]
        internal struct MouseInput
        {
            public int dx;
            public int dy;
            public uint mouseData;
            public NativeEnums.MouseEventFlags dwFlags;
            public uint time;
            public IntPtr dwExtraInfo;
        }
    }

    internal static class NativeEnums
    {
        internal enum SendInputEventType : int
        {
            Mouse = 0,
            Keyboard = 1,
            Hardware = 2,
        }

        internal enum MetricIndex : int
        {
            SM_CXSCREEN = 0,
            SM_CYSCREEN = 1
        }

        [Flags]
        internal enum MouseEventFlags : uint
        {
            Move = 0x0001,
            LeftDown = 0x0002,
            LeftUp = 0x0004,
            RightDown = 0x0008,
            RightUp = 0x0010,
            MiddleDown = 0x0020,
            MiddleUp = 0x0040,
            XDown = 0x0080,
            XUp = 0x0100,
            Wheel = 0x0800,
            Absolute = 0x8000,
        }
    }

这就是我如何称呼它的一个例子:

    public static void LeftDown()
    {
        NativeStructs.Input input = new NativeStructs.Input
        {
            type = NativeEnums.SendInputEventType.Mouse,
            mouseInput = new NativeStructs.MouseInput
            {
                dx = 0,
                dy = 0,
                mouseData = 0,
                dwFlags = NativeEnums.MouseEventFlags.Absolute | NativeEnums.MouseEventFlags.LeftDown,
                time = 0,
                dwExtraInfo = IntPtr.Zero,
            },
        };

        NativeMethods.SendInput(1, ref input, Marshal.SizeOf(input));
        _isLeftDown = true;
    }

此方法用于在WPF应用程序中完美运行,但在Windows 8.1 App中只有鼠标移动才有效。 不会在应用程序窗口外部或内部执行单击。代码被执行,不会引发异常或错误。 我也试过使用mouse_event,但情况是一样的。 我认为这是对应用程序的某种限制,但这种情况是否有解决办法?

P.S。我知道函数LeftDown()只执行mouse_down,这不是问题; - )

0 个答案:

没有答案