//* ────────────-_______________________* //* constructor & destructor ───────────────────────* //* -----------------------------------------------------------------------* /// <summary>コンストラクタ。</summary> /// /// <param name="guid">デバイスのインスタンスGUID</param> /// <param name="hWnd">ウィンドウ ハンドル</param> public CLegacyInput(Guid guid, IntPtr hWnd) { try { device = new Device(guid); CLogger.add("◎◎ レガシ ゲームパッド情報\r\n" + ToString()); CooperativeLevelFlags coLevel = CooperativeLevelFlags.NoWindowsKey | CooperativeLevelFlags.Background; device.SetDataFormat(DeviceDataFormat.Joystick); try { device.Properties.AutoCenter = false; } catch (Exception e) { CLogger.add("ゲームパッドのオート・センター機能のOFFに出来ませんでした。"); CLogger.add("このゲームパッドではフォース フィードバックは使用できません。"); CLogger.add(e); hWnd = IntPtr.Zero; } if (hWnd == IntPtr.Zero) { device.SetCooperativeLevel(null, CooperativeLevelFlags.NonExclusive | coLevel); } else { try { device.SetCooperativeLevel(hWnd, CooperativeLevelFlags.Exclusive | coLevel); } catch (Exception e) { CLogger.add("アプリケーションによるレガシ ゲームパッドの独占に失敗しました。"); CLogger.add("(共有モードで再設定を試みます。このモードではフォースフィードバックの使用は出来ません。)"); CLogger.add(e); hWnd = IntPtr.Zero; device.SetCooperativeLevel(null, CooperativeLevelFlags.NonExclusive | coLevel); } } device.Properties.AxisModeAbsolute = true; int[] anAxis = null; foreach (DeviceObjectInstance doi in device.Objects) { if ((doi.ObjectId & ( int )DeviceObjectTypeFlags.Axis) != 0) { device.Properties.SetRange( ParameterHow.ById, doi.ObjectId, new InputRange(-1000, 1000)); } if ((doi.Flags & ( int )ObjectInstanceFlags.Actuator) != 0) { int[] __anAxis; if (anAxis == null) { anAxis = new int[1]; } else { __anAxis = new int[anAxis.Length + 1]; anAxis.CopyTo(__anAxis, 0); anAxis = __anAxis; } anAxis[anAxis.Length - 1] = doi.Offset; if (anAxis.Length == 2) { break; } } } try { if (hWnd == IntPtr.Zero) { throw new UnsupportedException("共有モードではフォースフィードバックは使用は出来ません。"); } FORCE_PATTERNS.Add(EForcePreset.Square, createEffect(anAxis, 5000, 583333)); FORCE_PATTERNS.Add(EForcePreset.Short, createEffect(anAxis, 5000, 0, 100000)); FORCE_PATTERNS.Add(EForcePreset.Mild, createEffect(anAxis, 5000, 0, 1000000)); FORCE_PATTERNS.Add(EForcePreset.Hard, createEffect(anAxis, 10000, 0, 2000000)); } catch (Exception e) { CLogger.add("フォース フィードバックの作成に失敗しました。"); CLogger.add(e); } device.Acquire(); } catch (Exception e) { CLogger.add("レガシ ゲームパッドの初期化に失敗しました。"); CLogger.add(e); exception = e; Dispose(); } }