【问题标题】:joyGetPosEx returns 165 in C#joyGetPosEx 在 C# 中返回 165
【发布时间】:2014-04-05 19:25:11
【问题描述】:

我尝试从 C# 中的 JoyStick 中读取数据,只要我使用 jeyGetPos 执行它就可以正常工作。但是我需要使用joyGetPosEx,因为它提供了更多的日期,比如我需要的操纵杆的旋转。

class JoyStick
{
    JOYINFO pji;
    JOYINFOEX pjiex;
    MMRESULT mmresult;

    public JoyStick()
    {
        pji = new JOYINFO();
        pjiex = new JOYINFOEX();
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct JOYINFO
    {
        public uint wYpos;
        public uint wZpos;
        public uint wButtons;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct JOYINFOEX
    {
        public uint dwSize;
        public uint dwFlags;
        public uint dwXpos;
        public uint dwYpos;
        public uint dwZpos;
        public uint dwRpos;
        public uint dwUpos;
        public uint dwVpos;
        public uint dwButtons;
        public uint dwButtonNumber;
        public uint dwPOV;
        public uint dwReserved1;
        public uint dwReserved2;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct MMRESULT
    {
        public uint uJoyID;
    }

    [DllImport("winmm.dll")]
    public static extern uint joyGetNumDevs();
    [DllImport("winmm.dll")]
    public static extern MMRESULT joyGetPos(uint uJoyID, ref JOYINFO pji);
    [DllImport("winmm.dll"), System.Security.SuppressUnmanagedCodeSecurity]
    public static extern MMRESULT joyGetPosEx(uint uJoyID, ref JOYINFOEX pjiex);

    public uint getNumDevs()
    {
        return joyGetNumDevs();
    }

    private MMRESULT getPos(uint uJoyID, ref JOYINFO pji)
    {

        return joyGetPos(uJoyID, ref pji);
    }

    private MMRESULT getPosEx(uint uJoyID,  ref JOYINFOEX pjiex)
    {
        return joyGetPosEx(uJoyID, ref pjiex);
    }

    public JOYINFO getPos(uint id)
    {
        mmresult = getPos(id, ref pji);
        return pji;
    }

    public JOYINFOEX getPosEx(uint id)
    {
        mmresult = getPosEx(id, ref pjiex);
        return pjiex;
    }

    public uint getMMRESULT(){
        return mmresult.uJoyID;
    }
}

只要我尝试使用 joyGetPosEx 读取数据,MMRESULT.uJoyID 就是 165 但joyGetPos为0。 我相信 165 表示 ID 错误,但我尝试了从 0 到 15 的每个有效 ID。

我的错误在哪里?

【问题讨论】:

    标签: c# pinvoke joystick


    【解决方案1】:
    1. 无需声明MMRESULT结构,只需使用uint/int作为函数 返回值,或使用 enum
    2. 您必须填写dwSize 字段。

      pjiex.dwSize = Marshal.SizeOf(pjiex);

    【讨论】:

    • @user3139254 在 API 调用中填充结构的大小是很常见的——你会经常遇到dwSize。如果你查看 MSDN 的 joyGetPosEx 描述,你可以找到通知 - 你必须设置 dwSize 和 dwFlags 成员,否则 joyGetPosEx 将失败。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 2015-07-15
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多