private void InitBuffers() { // query active paths from the current computer. int result = CCDWrapper.GetDisplayConfigBufferSizes(CCDWrapper.QueryDisplayFlags.OnlyActivePaths, out _numPathArrayElements, out _numModeInfoArrayElements); if (result != 0) { ServiceRegistration.Get <ILogger>().Error("RefreshRateChanger: GetDisplayConfigBufferSizes(...) returned {0}", result); return; } _pathInfoArray = new CCDWrapper.DisplayConfigPathInfo[_numPathArrayElements]; _modeInfoArray = new CCDWrapper.DisplayConfigModeInfo[_numModeInfoArrayElements]; // Get display configuration result = CCDWrapper.QueryDisplayConfig(CCDWrapper.QueryDisplayFlags.OnlyActivePaths, ref _numPathArrayElements, _pathInfoArray, ref _numModeInfoArrayElements, _modeInfoArray, IntPtr.Zero); if (result != 0) { ServiceRegistration.Get <ILogger>().Error("RefreshRateChanger: QueryDisplayConfig(...) returned {0}", result); return; } _initialized = true; }
public bool SetRefreshRate(double refreshRate) { if (!_initialized) { return(false); } // Set proper numerator and denominator for refresh rate UInt32 newRefreshRate = (uint)(refreshRate * 1000); UInt32 numerator; UInt32 denominator; CCDWrapper.DisplayConfigScanLineOrdering scanLineOrdering; switch (newRefreshRate) { case 23976: numerator = 24000; denominator = 1001; scanLineOrdering = CCDWrapper.DisplayConfigScanLineOrdering.Progressive; break; case 24000: numerator = 24000; denominator = 1000; scanLineOrdering = CCDWrapper.DisplayConfigScanLineOrdering.Progressive; break; case 25000: numerator = 25000; denominator = 1000; scanLineOrdering = CCDWrapper.DisplayConfigScanLineOrdering.Progressive; break; case 29970: numerator = 30000; denominator = 1001; scanLineOrdering = CCDWrapper.DisplayConfigScanLineOrdering.Progressive; break; case 30000: numerator = 30000; denominator = 1000; scanLineOrdering = CCDWrapper.DisplayConfigScanLineOrdering.Progressive; break; case 50000: numerator = 50000; denominator = 1000; scanLineOrdering = CCDWrapper.DisplayConfigScanLineOrdering.Progressive; break; case 59940: numerator = 60000; denominator = 1001; scanLineOrdering = CCDWrapper.DisplayConfigScanLineOrdering.Progressive; break; case 60000: numerator = 60000; denominator = 1000; scanLineOrdering = CCDWrapper.DisplayConfigScanLineOrdering.Progressive; break; default: numerator = newRefreshRate / 1000; denominator = 1; scanLineOrdering = CCDWrapper.DisplayConfigScanLineOrdering.Progressive; break; } // Set refresh rate parameters in display config var modeIndex = _displayIndex * 2; // Array always contains "Source" and "Target" per display _modeInfoArray[modeIndex].TargetMode.TargetVideoSignalInfo.VerticalSyncFreq.Numerator = numerator; _modeInfoArray[modeIndex].TargetMode.TargetVideoSignalInfo.VerticalSyncFreq.Denominator = denominator; _modeInfoArray[modeIndex].TargetMode.TargetVideoSignalInfo.ScanLineOrdering = scanLineOrdering; // Validate new refresh rate CCDWrapper.SdcFlags flags = CCDWrapper.SdcFlags.Validate | CCDWrapper.SdcFlags.UseSuppliedDisplayConfig; long result = CCDWrapper.SetDisplayConfig(_numPathArrayElements, _pathInfoArray, _numModeInfoArrayElements, _modeInfoArray, flags); // Adding SDC_ALLOW_CHANGES to flags if validation failed if (result != 0) { ServiceRegistration.Get <ILogger>().Debug("RefreshRateChanger.SetDisplayConfig(...): SDC_VALIDATE of {0}/{1} failed", numerator, denominator); flags = CCDWrapper.SdcFlags.Apply | CCDWrapper.SdcFlags.UseSuppliedDisplayConfig | CCDWrapper.SdcFlags.AllowChanges; } else { ServiceRegistration.Get <ILogger>().Debug("RefreshRateChanger.SetDisplayConfig(...): SDC_VALIDATE of {0}/{1} succesful", numerator, denominator); flags = CCDWrapper.SdcFlags.Apply | CCDWrapper.SdcFlags.UseSuppliedDisplayConfig; } // Configuring display result = CCDWrapper.SetDisplayConfig(_numPathArrayElements, _pathInfoArray, _numModeInfoArrayElements, _modeInfoArray, flags); if (result != 0) { ServiceRegistration.Get <ILogger>().Warn("RefreshRateChanger.SetDisplayConfig(...): SDC_APPLY returned {0}", result); return(false); } ServiceRegistration.Get <ILogger>().Debug("RefreshRateChanger.SetDisplayConfig(...): Successfully switched to {0}/{1}", numerator, denominator); Windows7DwmFix.FixDwm(); _rateChanged = true; return(true); }