//* ────────────-_______________________*
        //* 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();
            }
        }