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"); }
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); }