Вопрос

Я хочу захватить вход от джойстика, используя WinMM DLL .. У меня нет много знаний о импорте и работе с DLL.

Я пытался сделать это, но я понятия не имею, как это сделать ..

[DllImport("winmm.dll")]
public static extern string joyGetPosEx(uint dev, JoyinfoEx ) //Something Similar

Как мне получить joyinfoex struct из dll и положить его в joygetmosex ..? : S.

Это было полезно?

Решение

Как показывает ваш вопрос, вы должны импортировать joyGetPosEx функция от wimmm.dll. Отказ Это часто называют P / вызывание Потому что вы вызываете функцию из родного API Win32 (или «платформу» DLL). Вы уже знаете, что вам нужно использовать эту функцию, поэтому давайте посмотрим на это более осторожно.

То документация Для этой функции указывает, что требуется два параметра:

  • Первый (uJoyID) простой int (или, целое число) значение, которое идентифицирует джойстик, который должен быть запрошен.

  • Второй (pji) немного сложнее, чем первый, и я думаю, что это часть, с которой вы борелись. Вместо стандартного типа значения это структура называется JOYINFOEX, И вы должны определить эту структуру в вашем коде. Что за joyGetPosEx Функция выполняет эту специальную структуру с информацией о положении джойстика, что позволяет ему вернуть кучу разных значений все сразу. Вот почему вы должны пройти его в качестве ссылки (ref), потому что функция на самом деле собирается наполнять Экземпляр структуры, который вы передаете ему с помощью набора значений. Ваш код может затем прочитать эти значения обратно вне переменной, содержащей экземпляр структуры.

    Документация для этой структуры доступна здесь, и говорит вам имена и типы данных
    каждого из его членов. Вы можете лечить DWORD как а int, Так что его декларация выглядит так:

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

Наконец то joyGetPosEx Функция возвращает значение типа int. Отказ Это значение говорит вам, может ли функция преуспеть, и если бы она не сделала, то, что именно пошло не так. Это код ошибки. Приведенная выше документация приведена таблица всех возможных значений, которые можно вернуть. Если вы хотите проверить на этих ценностях, вам нужно будет определить их в качестве констант в вашем коде:

public const int JOYERR_BASE = 160
public const int JOYERR_PARMS = (JOYERR_BASE + 5); 
public const int JOYERR_UNPLUGGED = (JOYERR_BASE + 7);
public const int MMSYSERR_BASE = 0;
public const int MMSYSERR_BADDEVICEID = (MMSYSERR_BASE + 2); 
public const int MMSYSERR_INVALPARAM = (MMSYSERR_BASE + 11); 

Итак, учитывая вышеизложенное, окончательное определение функции выглядит так:

[DllImport("winmm.dll")]
public static extern int joyGetPosEx(int uJoyID, ref JOYINFOEX pji);

В будущем имейте в виду pinvoke.net.net. В качестве ссылки на то, как определить и объявить эти функции API Win32 в вашем коде. Не имеет joyGetPosEx Функция (или, по крайней мере, не то, что я нашел), но обычно есть почти все, что вам нужно. И тогда, если это не удается, вы можете сделать, как я пытался объяснить выше: посмотрите на оригинальную документацию для функции и попытайтесь понять, чтобы определить ее соответственно для работы в .NET.

Другие советы

Функция возвращает данные через второй аргумент. Возвращаемое значение - это целое число, что указывает на любую возможную ошибку. Правильная декларация:

    [DllImport("winmm.dll")]
    private static extern int joyGetPosEx(int joystickNumber, ref JOYINFOEX info);

Вам придется объявить структуру, как это:

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

Образец вызова:

        JOYINFOEX info = new JOYINFOEX();
        info.dwSize = Marshal.SizeOf(info);
        int err = joyGetPosEx(1, ref info);
        if (err != 0) reportError(err);
        else {
            int xpos = info.dwXpos;
            // Do something with xpos
            //...
        }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top