/// <summary> /// Asynchronously fades from the current DWM color to <paramref name="newColor" />. /// </summary> /// <param name="newColor">The new color to fade to.</param> public static async Task BeginChangeColor(Color newColor, float duration = DURATION) { await Task.Run(() => { int ticks = (int)(FRAMES_PER_SECOND * DURATION); // Round to the nearest whole step DwmColorParams p = new DwmColorParams(); DwmpGetColorizationParameters(out p); Color startColor = Color.FromArgb((int)p.ColorizationColor); if (newColor == startColor) { return; } ColorTransform ct = new ColorTransform(startColor, newColor, ticks); while (ct.Transform()) { if (p.ColorizationColor != (uint)ct.GetColor().ToArgb()) { p.ColorizationColor = (uint)ct.GetColor().ToArgb(); p.ColorizationAfterglow = p.ColorizationColor; DwmpSetColorizationParameters(ref p, true); Thread.Sleep((int)((1.00 / FRAMES_PER_SECOND) * 1000)); // Sleep for one "tick" (based on FPS). } } }); }