我开发了一个简单的控制台应用程序来使用 xinput 轮询 Xbox 控制器。我想使用从其中一个拇指杆获得的值来移动鼠标。我可以从摇杆获取 x 和 y 值,但是当我将这些值用于 SendInput()(使用 User32.dll)时,鼠标不会移动,返回值为 0。
根据微软的说法,“如果函数返回零,则输入已被另一个线程阻塞。”
如何找到阻塞它的另一个线程?它只是一个由 Visual Studio 启动的简单控制台应用程序 (exe),它将 x 和 y 值打印到屏幕上并尝试移动鼠标。
long x = controller.x; // values from the controller
long y = controller.y; // these are checked and do contain numbers
INPUT mouseMoveInput = new INPUT();
mouseMoveInput.type = 0; // mouse
mouseMoveInput.mi.dx = x;
mouseMoveInput.mi.dy = y;
mouseMoveInput.mi.mouseData = 0;
mouseMoveInput.mi.dwFlags = MOUSEEVENTF_MOVE;
var result = SendInput(1, ref mouseMoveInput, Marshal.SizeOf(new INPUT());
// result always returns 0
我错过了什么吗?这应该工作吗?
以下是声明:
[StructLayout(LayoutKind.Explicit)]
public struct MOUSEINPUT
{
[FieldOffset(0)]
public long X;
[FieldOffset(8)]
public long Y;
[FieldOffset(16)]
public uint MouseData;
[FieldOffset(20)]
public uint Flags;
[FieldOffset(24)]
public uint Time;
[FieldOffset(28)]
public IntPtr ExtraInfo;
}
[StructLayout(LayoutKind.Sequential)]
internal struct KEYBOARDINPUT
{
public ushort Vk;
public ushort Scan;
public uint Flags;
public uint Time;
public IntPtr ExtraInfo;
}
[StructLayout(LayoutKind.Sequential)]
internal struct HARDWAREINPUT
{
public uint Msg;
public ushort ParamL;
public ushort ParamH;
}
[StructLayout(LayoutKind.Explicit)]
public struct INPUT
{
[FieldOffset(0)]
public uint type;
[FieldOffset(4)]
public MOUSEINPUT mi;
[FieldOffset(4)]
public KEYBOARDINPUT ki;
[FieldOffset(4)]
public HARDWAREINPUT hi;
}
更新: usingmouse-event
确实有效,但不推荐使用此功能。既然它有效,那么使用它是否有问题?
我对结构大小有些奇怪:
tagINPUT 的大小:40
mouseMoveInput 的大小:40
MOUSEINPUT 的大小:32
uint 的大小:4
但是如果tagINPUT
包含,MOUSEINPUT
那么uint
它的大小不应该是 36 吗?