public PhysicalMonitor(Win32.Dxva2.PhysicalMonitorEnumerationApi.PHYSICAL_MONITOR physicalMonitor)
        {
            _physicalMonitor = physicalMonitor;

            Win32.Dxva2.HighlevelMonitorConfigurationApi.GetMonitorCapabilities(_physicalMonitor.hPhysicalMonitor,
                                                                                out _pdwMonitorCapabilities,
                                                                                out _pdwSupportedColorTemperatures);

            Brightness = new MinMaxVal<uint>(
                () =>
                    {
                        uint min, val, max;
                        Win32.Dxva2.HighlevelMonitorConfigurationApi.GetMonitorBrightness(
                            _physicalMonitor.hPhysicalMonitor, out min, out val, out max);
                        return Tuple.Create(min, val, max);
                    },
                (min, val, max) =>
                Win32.Dxva2.HighlevelMonitorConfigurationApi.SetMonitorBrightness(_physicalMonitor.hPhysicalMonitor, val));

            Contrast = new MinMaxVal<uint>(
                () =>
                    {
                        uint min, val, max;
                        Win32.Dxva2.HighlevelMonitorConfigurationApi.GetMonitorContrast(
                            _physicalMonitor.hPhysicalMonitor, out min, out val, out max);
                        return Tuple.Create(min, val, max);
                    },
                (min, val, max) =>
                Win32.Dxva2.HighlevelMonitorConfigurationApi.SetMonitorContrast(_physicalMonitor.hPhysicalMonitor, val));

            Drive = new RGBSetting<uint>(
                new MinMaxVal<uint>(
                    () =>
                        {
                            uint min, val, max;
                            Win32.Dxva2.HighlevelMonitorConfigurationApi.GetMonitorRedGreenOrBlueDrive(
                                _physicalMonitor.hPhysicalMonitor,
                                Win32.Dxva2.HighlevelMonitorConfigurationApi.MC_DRIVE_TYPE.MC_RED_DRIVE, out min,
                                out val, out max);
                            return Tuple.Create(min, val, max);
                        },
                    (min, val, max) => Win32.Dxva2.HighlevelMonitorConfigurationApi.SetMonitorRedGreenOrBlueDrive(
                        _physicalMonitor.hPhysicalMonitor,
                        Win32.Dxva2.HighlevelMonitorConfigurationApi.MC_DRIVE_TYPE.MC_RED_DRIVE,
                        val))
                ,
                new MinMaxVal<uint>(
                    () =>
                        {
                            uint min, val, max;
                            Win32.Dxva2.HighlevelMonitorConfigurationApi.GetMonitorRedGreenOrBlueDrive(
                                _physicalMonitor.hPhysicalMonitor,
                                Win32.Dxva2.HighlevelMonitorConfigurationApi.MC_DRIVE_TYPE.MC_GREEN_DRIVE, out min,
                                out val, out max);
                            return Tuple.Create(min, val, max);
                        },
                    (min, val, max) => Win32.Dxva2.HighlevelMonitorConfigurationApi.SetMonitorRedGreenOrBlueDrive(
                        _physicalMonitor.hPhysicalMonitor,
                        Win32.Dxva2.HighlevelMonitorConfigurationApi.MC_DRIVE_TYPE.MC_GREEN_DRIVE,
                        val))
                , new MinMaxVal<uint>(
                      () =>
                          {
                              uint min, val, max;
                              Win32.Dxva2.HighlevelMonitorConfigurationApi.GetMonitorRedGreenOrBlueDrive(
                                  _physicalMonitor.hPhysicalMonitor,
                                  Win32.Dxva2.HighlevelMonitorConfigurationApi.MC_DRIVE_TYPE.MC_BLUE_DRIVE, out min,
                                  out val, out max);
                              return Tuple.Create(min, val, max);
                          },
                      (min, val, max) => Win32.Dxva2.HighlevelMonitorConfigurationApi.SetMonitorRedGreenOrBlueDrive(
                          _physicalMonitor.hPhysicalMonitor,
                          Win32.Dxva2.HighlevelMonitorConfigurationApi.MC_DRIVE_TYPE.MC_BLUE_DRIVE,
                          val))
                );

            Gain = new RGBSetting<uint>(
                new MinMaxVal<uint>(
                    () =>
                        {
                            uint min, val, max;
                            Win32.Dxva2.HighlevelMonitorConfigurationApi.GetMonitorRedGreenOrBlueGain(
                                _physicalMonitor.hPhysicalMonitor,
                                Win32.Dxva2.HighlevelMonitorConfigurationApi.MC_GAIN_TYPE.MC_RED_GAIN, out min,
                                out val, out max);
                            return Tuple.Create(min, val, max);
                        },
                    (min, val, max) => Win32.Dxva2.HighlevelMonitorConfigurationApi.SetMonitorRedGreenOrBlueGain(
                        _physicalMonitor.hPhysicalMonitor,
                        Win32.Dxva2.HighlevelMonitorConfigurationApi.MC_GAIN_TYPE.MC_RED_GAIN,
                        val))
                ,
                new MinMaxVal<uint>(
                    () =>
                        {
                            uint min, val, max;
                            Win32.Dxva2.HighlevelMonitorConfigurationApi.GetMonitorRedGreenOrBlueGain(
                                _physicalMonitor.hPhysicalMonitor,
                                Win32.Dxva2.HighlevelMonitorConfigurationApi.MC_GAIN_TYPE.MC_GREEN_GAIN, out min,
                                out val, out max);
                            return Tuple.Create(min, val, max);
                        },
                    (min, val, max) => Win32.Dxva2.HighlevelMonitorConfigurationApi.SetMonitorRedGreenOrBlueGain(
                        _physicalMonitor.hPhysicalMonitor,
                        Win32.Dxva2.HighlevelMonitorConfigurationApi.MC_GAIN_TYPE.MC_GREEN_GAIN,
                        val))
                , new MinMaxVal<uint>(
                      () =>
                          {
                              uint min, val, max;
                              Win32.Dxva2.HighlevelMonitorConfigurationApi.GetMonitorRedGreenOrBlueGain(
                                  _physicalMonitor.hPhysicalMonitor,
                                  Win32.Dxva2.HighlevelMonitorConfigurationApi.MC_GAIN_TYPE.MC_BLUE_GAIN, out min,
                                  out val, out max);
                              return Tuple.Create(min, val, max);
                          },
                      (min, val, max) => Win32.Dxva2.HighlevelMonitorConfigurationApi.SetMonitorRedGreenOrBlueGain(
                          _physicalMonitor.hPhysicalMonitor,
                          Win32.Dxva2.HighlevelMonitorConfigurationApi.MC_GAIN_TYPE.MC_BLUE_GAIN,
                          val))
                );
        }
        public PhysicalMonitor(Win32.Dxva2.PhysicalMonitorEnumerationApi.PHYSICAL_MONITOR physicalMonitor)
        {
            _physicalMonitor = physicalMonitor;

            Win32.Dxva2.HighlevelMonitorConfigurationApi.GetMonitorCapabilities(_physicalMonitor.hPhysicalMonitor,
                                                                                out _pdwMonitorCapabilities,
                                                                                out _pdwSupportedColorTemperatures);

            Brightness = new MinMaxVal <uint>(
                () =>
            {
                uint min, val, max;
                Win32.Dxva2.HighlevelMonitorConfigurationApi.GetMonitorBrightness(
                    _physicalMonitor.hPhysicalMonitor, out min, out val, out max);
                return(Tuple.Create(min, val, max));
            },
                (min, val, max) =>
                Win32.Dxva2.HighlevelMonitorConfigurationApi.SetMonitorBrightness(_physicalMonitor.hPhysicalMonitor, val));

            Contrast = new MinMaxVal <uint>(
                () =>
            {
                uint min, val, max;
                Win32.Dxva2.HighlevelMonitorConfigurationApi.GetMonitorContrast(
                    _physicalMonitor.hPhysicalMonitor, out min, out val, out max);
                return(Tuple.Create(min, val, max));
            },
                (min, val, max) =>
                Win32.Dxva2.HighlevelMonitorConfigurationApi.SetMonitorContrast(_physicalMonitor.hPhysicalMonitor, val));

            Drive = new RGBSetting <uint>(
                new MinMaxVal <uint>(
                    () =>
            {
                uint min, val, max;
                Win32.Dxva2.HighlevelMonitorConfigurationApi.GetMonitorRedGreenOrBlueDrive(
                    _physicalMonitor.hPhysicalMonitor,
                    Win32.Dxva2.HighlevelMonitorConfigurationApi.MC_DRIVE_TYPE.MC_RED_DRIVE, out min,
                    out val, out max);
                return(Tuple.Create(min, val, max));
            },
                    (min, val, max) => Win32.Dxva2.HighlevelMonitorConfigurationApi.SetMonitorRedGreenOrBlueDrive(
                        _physicalMonitor.hPhysicalMonitor,
                        Win32.Dxva2.HighlevelMonitorConfigurationApi.MC_DRIVE_TYPE.MC_RED_DRIVE,
                        val))
                ,
                new MinMaxVal <uint>(
                    () =>
            {
                uint min, val, max;
                Win32.Dxva2.HighlevelMonitorConfigurationApi.GetMonitorRedGreenOrBlueDrive(
                    _physicalMonitor.hPhysicalMonitor,
                    Win32.Dxva2.HighlevelMonitorConfigurationApi.MC_DRIVE_TYPE.MC_GREEN_DRIVE, out min,
                    out val, out max);
                return(Tuple.Create(min, val, max));
            },
                    (min, val, max) => Win32.Dxva2.HighlevelMonitorConfigurationApi.SetMonitorRedGreenOrBlueDrive(
                        _physicalMonitor.hPhysicalMonitor,
                        Win32.Dxva2.HighlevelMonitorConfigurationApi.MC_DRIVE_TYPE.MC_GREEN_DRIVE,
                        val))
                , new MinMaxVal <uint>(
                    () =>
            {
                uint min, val, max;
                Win32.Dxva2.HighlevelMonitorConfigurationApi.GetMonitorRedGreenOrBlueDrive(
                    _physicalMonitor.hPhysicalMonitor,
                    Win32.Dxva2.HighlevelMonitorConfigurationApi.MC_DRIVE_TYPE.MC_BLUE_DRIVE, out min,
                    out val, out max);
                return(Tuple.Create(min, val, max));
            },
                    (min, val, max) => Win32.Dxva2.HighlevelMonitorConfigurationApi.SetMonitorRedGreenOrBlueDrive(
                        _physicalMonitor.hPhysicalMonitor,
                        Win32.Dxva2.HighlevelMonitorConfigurationApi.MC_DRIVE_TYPE.MC_BLUE_DRIVE,
                        val))
                );

            Gain = new RGBSetting <uint>(
                new MinMaxVal <uint>(
                    () =>
            {
                uint min, val, max;
                Win32.Dxva2.HighlevelMonitorConfigurationApi.GetMonitorRedGreenOrBlueGain(
                    _physicalMonitor.hPhysicalMonitor,
                    Win32.Dxva2.HighlevelMonitorConfigurationApi.MC_GAIN_TYPE.MC_RED_GAIN, out min,
                    out val, out max);
                return(Tuple.Create(min, val, max));
            },
                    (min, val, max) => Win32.Dxva2.HighlevelMonitorConfigurationApi.SetMonitorRedGreenOrBlueGain(
                        _physicalMonitor.hPhysicalMonitor,
                        Win32.Dxva2.HighlevelMonitorConfigurationApi.MC_GAIN_TYPE.MC_RED_GAIN,
                        val))
                ,
                new MinMaxVal <uint>(
                    () =>
            {
                uint min, val, max;
                Win32.Dxva2.HighlevelMonitorConfigurationApi.GetMonitorRedGreenOrBlueGain(
                    _physicalMonitor.hPhysicalMonitor,
                    Win32.Dxva2.HighlevelMonitorConfigurationApi.MC_GAIN_TYPE.MC_GREEN_GAIN, out min,
                    out val, out max);
                return(Tuple.Create(min, val, max));
            },
                    (min, val, max) => Win32.Dxva2.HighlevelMonitorConfigurationApi.SetMonitorRedGreenOrBlueGain(
                        _physicalMonitor.hPhysicalMonitor,
                        Win32.Dxva2.HighlevelMonitorConfigurationApi.MC_GAIN_TYPE.MC_GREEN_GAIN,
                        val))
                , new MinMaxVal <uint>(
                    () =>
            {
                uint min, val, max;
                Win32.Dxva2.HighlevelMonitorConfigurationApi.GetMonitorRedGreenOrBlueGain(
                    _physicalMonitor.hPhysicalMonitor,
                    Win32.Dxva2.HighlevelMonitorConfigurationApi.MC_GAIN_TYPE.MC_BLUE_GAIN, out min,
                    out val, out max);
                return(Tuple.Create(min, val, max));
            },
                    (min, val, max) => Win32.Dxva2.HighlevelMonitorConfigurationApi.SetMonitorRedGreenOrBlueGain(
                        _physicalMonitor.hPhysicalMonitor,
                        Win32.Dxva2.HighlevelMonitorConfigurationApi.MC_GAIN_TYPE.MC_BLUE_GAIN,
                        val))
                );
        }