コード例 #1
0
        public unsafe void InitJoy()
        {
            Stopwatch st = new Stopwatch();

            st.Restart();
            JOYCAPS_size = Marshal.SizeOf(typeof(JOYCAPS));

            for (int i = 0; i < 256; i++)
            {
                if (joyGetDevCaps(i, ref joycap, JOYCAPS_size) == 0)
                {
                    DeviceJoyInfo info = new DeviceJoyInfo();

                    //set id
                    info.ID = i;

                    //check joyex
                    if (joyGetPosEx(i, ref jsx) == 0)     //獲取遊戲設備的座標位置和按鈕狀態
                    {
                        info.JoyEx      = true;
                        info.Way_X_old  = jsx.dwXpos;
                        info.Way_Y_old  = jsx.dwYpos;
                        info.Way_Z_old  = jsx.dwZpos;
                        info.Way_L2_old = jsx.dwUpos;
                    }
                    else if (joyGetPos(i, ref js) == 0)   // 查詢指定的遊戲桿設備的位置和活動性
                    {
                        info.JoyEx      = false;
                        info.Way_X_old  = js.wXpos;
                        info.Way_Y_old  = js.wYpos;
                        info.Way_Z_old  = js.wZpos;
                        info.Way_L2_old = jsx.dwUpos;
                    }
                    else
                    {
                        continue;  //裝置功能失效
                    }
                    //set button count
                    info.ButtonCount = joycap.wNumButtons;

                    info.Button_old = 0;

                    if (joycap.wPeriodMin > PeriodMin)
                    {
                        PeriodMin = joycap.wPeriodMin;
                    }

                    joyinfo_list.Add(info);
                }
            }
            //取出所有目前連線遊戲手把中最慢的PeriodMin然後+5ms
            PeriodMin += 95;
            new Thread(polling_listener).Start();
            st.Stop();
            //Console.WriteLine("init joypad infor : " + st.ElapsedMilliseconds + " ms");
        }
コード例 #2
0
        List <joystickEvent> joy_event_captur()
        {
            List <joystickEvent> event_list = new List <joystickEvent>();

            for (int i_button = 0; i_button < joyinfo_list.Count(); i_button++)
            {
                DeviceJoyInfo button_inf   = joyinfo_list[i_button];
                int           button_id    = button_inf.ID;
                int           button_count = button_inf.ButtonCount;

                int button_now, X_now, Y_now, Z_now;
                int L2_now;
                if (button_inf.JoyEx == false)
                {
                    joyGetPos(button_id, ref js);
                    button_now  = js.wButtons;
                    button_type = 1;
                    X_now       = js.wXpos;
                    Y_now       = js.wYpos;
                    Z_now       = js.wZpos;
                    L2_now      = jsx.dwUpos;
                }
                else
                {
                    joyGetPosEx(button_id, ref jsx);
                    button_now  = jsx.dwButtons;
                    button_type = 2;
                    X_now       = jsx.dwXpos;
                    Y_now       = jsx.dwYpos;
                    Z_now       = jsx.dwZpos;
                    L2_now      = jsx.dwUpos;
                }

                int button_old = button_inf.Button_old;
                int X_old      = button_inf.Way_X_old;
                int Y_old      = button_inf.Way_Y_old;
                int Z_old      = button_inf.Way_Z_old;
                int R_old      = button_inf.Way_R_old;
                int L2_old     = button_inf.Way_L2_old;

                button_inf.Button_old = button_now;
                button_inf.Way_X_old  = X_now;
                button_inf.Way_Y_old  = Y_now;
                button_inf.Way_Z_old  = Z_now;
                button_inf.Way_L2_old = L2_now;

                joyinfo_list[i_button] = button_inf;
                if (button_old != button_now || button_now != 0)
                {
                    for (int i = 0; i < button_count; i++)
                    {
                        if ((button_now & 1) != 0)  //按下按鈕
                        {
                            joystickEvent event_item = new joystickEvent();
                            event_item.event_type   = 1;  //1:判定為按鈕
                            event_item.joystick_id  = button_inf.ID;
                            event_item.button_id    = i + 1;
                            event_item.button_event = 1;   //1:判定為壓下
                            event_list.Add(event_item);
                        }
                        else
                        {
                            if ((button_now & 1) != (button_old & 1))  //鬆開按鈕
                            {
                                joystickEvent event_item = new joystickEvent();
                                event_item.event_type   = 1;
                                event_item.joystick_id  = button_inf.ID;
                                event_item.button_id    = i + 1;
                                event_item.button_event = 0;   //0:判定為鬆開
                                event_list.Add(event_item);
                            }
                        }
                        button_now >>= 1;
                        button_old >>= 1;
                    }
                }

                if (X_old != X_now)
                {
                    joystickEvent event_item = new joystickEvent();
                    event_item.event_type  = 0;    //0:判定為方向鍵
                    event_item.joystick_id = button_inf.ID;
                    event_item.way_type    = 0;    //0:判定為x方向
                    event_item.way_value   = X_now;
                    event_list.Add(event_item);
                }

                if (Y_old != Y_now)
                {
                    joystickEvent event_item = new joystickEvent();
                    event_item.event_type  = 0;
                    event_item.joystick_id = button_inf.ID;
                    event_item.way_type    = 1; //1:判定為y方向
                    event_item.way_value   = Y_now;
                    event_list.Add(event_item);
                }

                if (Z_old != Z_now)
                {
                    joystickEvent event_item = new joystickEvent();
                    event_item.event_type  = 0;
                    event_item.joystick_id = button_inf.ID;
                    event_item.way_type    = 2; //2:判定為z方向
                    event_item.way_value   = Z_now;
                    event_list.Add(event_item);
                }

                if (L2_old != L2_now)
                {
                    joystickEvent event_item = new joystickEvent();
                    event_item.event_type  = 0;
                    event_item.joystick_id = button_inf.ID;
                    event_item.way_type    = 3; //2:判定為l2方向
                    event_item.way_value   = L2_now;
                    event_list.Add(event_item);
                }
            }
            return(event_list);
        }