Джойстик Ключ захват
Вопрос
Я хочу захватить вход от джойстика, используя 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
//...
}