我正在尝试将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,这不是问题; - )