Страница 1 из 1

Использование джойстика в C# БЕЗ СРЕДСТВ DIRECTX

Добавлено: Ср июн 03, 2009 1:03 am
blackstrip
Была такая проблема - добавить в уже существующую прогу управление джойстиком. Но ооочень не хотелось приматывать к проге directx sdk. Тем более что мне не нужно было чтоб прога поддерживала сто джойстиков по сто кнопок в каждом, мне просто надо было отследить нажатие клавиши единственного джойстика, подключенного к компу.

Есть такая функция WinApi joyGetPosEx - с ее помощью можно узнать чо нажато, а то не нажато. Вот в общем листинг кода, который позволит отследить конкретные нажатия клавиш (собрано по инету с нескольких источников, работоспособность подтверждена на реальной проге):

вверху пишем
using System.Runtime.InteropServices;

пониже после
public class Вашкласс : System.Windows.Forms.Form
{

записываем импорт этой функции из библиотеки winmm.dll

[DllImport("winmm.dll", CallingConvention = CallingConvention.StdCall)]
public static extern Int32 joyGetPosEx(Int32 uJoyID, ref JOYINFOEX pji);

еще пониже создаем тип JOYINFOEX:
public struct JOYINFOEX
{
public Int32 dwSize;
public Int32 dwFlags;
public Int32 dwXpos;
public Int32 dwYpos;
public Int32 dwZpos;
public Int32 dwRpos;
public Int32 dwUpos;
public Int32 dwVpos;
public Int32 dwButtons;
public Int32 dwButtonNumber;
public Int32 dwPOV;
public Int32 dwReserved1;
public Int32 dwReserved2;
}

и удобные константы для использования тож объявляем:

public static Int32 JOY_RETURNX = 0x00000001;
public static Int32 JOY_RETURNY = 0x00000002;
public static Int32 JOY_RETURNZ = 0x00000004;
public static Int32 JOY_RETURNR = 0x00000008;
public static Int32 JOY_RETURNU = 0x00000010;
public static Int32 JOY_RETURNV = 0x00000020;
public static Int32 JOY_RETURNPOV = 0x00000040;
public static Int32 JOY_RETURNBUTTONS = 0x00000080;
public static Int32 JOY_RETURNALL = (JOY_RETURNX | JOY_RETURNY | JOY_RETURNZ | JOY_RETURNR | JOY_RETURNU | JOY_RETURNV | JOY_RETURNPOV | JOY_RETURNBUTTONS);

все. теперь делаем опрос джойстика - я делал через таймер с интервалом 100 мс =) главное чтоб процедура обработки нажатий быстро-быстро выполнялась и для работы проги оставалось много времени (ну мне торопиться выполнять ее было особо некуда, ибо клавишами джойстика я просто управлял элементами на форме, флажки и кнопки нажимал):

вот были мои константы (коды кнопок "педалей", которые я припаял уже к джойстику. в общем коды клавиш 32 и 128 - то есть клавиш джойстика номер 6 и номер 8)
//32 - тормоз (левая)
//128 - газ (правая)
public Boolean LeftPushed = false;
public Boolean RightPushed = false;

т.е. сначала прога думает что ни одна из кнопок (ни 6, ни 8 - не нажаты)

по срабатыванию таймера вызываем джойстик и смотрим чо там нажалося с последней проверки или отпустилося наоборот
private void timer3_Tick(object sender, EventArgs e)
{
JOYINFOEX a = new JOYINFOEX();
a.dwSize = 13 * 4; (13 полей по 4 байт каждое)
a.dwFlags = JOY_RETURNALL;
int b = joyGetPosEx(0, ref a);

//сняли кнопки джойстика
if (((a.dwButtons & 32) != 0)&(!LeftPushed)) { //нажали левую, раньше была выключена
LeftPushed = true;
} else if (((a.dwButtons & 32) == 0)&(LeftPushed)) {//отпустили левую, раньше была включена
LeftPushed=false;
}

if (((a.dwButtons & 128) != 0) & (!RightPushed)) { //нажали правую, раньше была выключена
RightPushed=true;
} else if (((a.dwButtons & 128) == 0)&(RightPushed)) {//отпустили правую, раньше была включена
RightPushed=false;
}

}

вот и все собственно. теперь в любом месте проги по проверке переменных LeftPushed и RightPushed я могу узнать нажаты или отпущены в данный момент эти клавиши. также можно в эти процедуры впихнуть само действие на нажатие или отпускание той или иной клавиши. соответственно вы можете кроме контроля клавиш 6 и 8 контролировать и другие тоже (1 - 1ая клавиша, 2 - 2ая клавиша, 4 - 3я клавиша, 8 - 4ая клавиша, 16 - 5ая клавиша, 32 - 6ая клавиша и т.д.)

вот так без DirectX можно контролировать джойстик

Re: Использование джойстика в C# БЕЗ СРЕДСТВ DIRECTX

Добавлено: Вс ноя 14, 2010 5:13 am
Demon_GRU
Спасибо) работает.