TableCloth icon indicating copy to clipboard operation
TableCloth copied to clipboard

[제안] 샌드박스에 사용자 선호 설정 적용

Open SimYunSup opened this issue 9 months ago • 1 comments

제안해주시는 기능이 소프트웨어로 인해 발생한 문제 때문인가요? 그렇다면 자세히 알려주세요. 윈도우 샌드박스 안의 테마 설정이 밖의 테마 설정과 다를 때 불편합니다.

어떻게 개선한다면 좋을까요? 윈도우 바깥의 사용자 설정(라이트/다크, 고대비)을 내부 샌드박스 환경에도 적용했으면 좋겠습니다.

추가 맥락 가능하면 제가 PR을 진행하고 싶은데, 가능한지 묻고 싶습니다.

SimYunSup avatar Mar 14 '25 11:03 SimYunSup

넵, 검토해주셔서 감사합니다! 제 생각으로는 구현할 때 Spork에 전달할 인자에 관련 설정을 추가해야 하는 부분, 그리고 Windows의 컬러 테마 설정 변경 후 샌드박스 내에서 전체적으로 리프레시하는 부분의 구현이 필요할 것 같습니다. 아래는 제가 프로토타이핑해본 LINQPad 스크립트인데, 구현하실 때 참고하시면 좋을 듯 해서 같이 올립니다.

<Query Kind="Program">
  <Namespace>Microsoft.Win32</Namespace>
  <Namespace>System.Runtime.InteropServices</Namespace>
  <Namespace>System.Threading.Tasks</Namespace>
</Query>

internal static class Program
{
	[DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
	private static extern bool SendNotifyMessageW(IntPtr hWnd, uint msg, int wParam, string lParam);

	[DllImport("user32.dll")]
	private static extern bool SetSysColors(int cElements, int[] lpaElements, int[] lpaRgbValues);

	private const int WM_SETTINGCHANGE = 0x1A;

	private const int COLOR_DESKTOP = 1;

	static int ColorToInt(int r, int g, int b)
		=> (b << 16) | (g << 8) | r;

	static void SetDarkMode(bool enableDarkMode)
	{
		var mode = enableDarkMode ? 0 : 1;
		var colors = new int[] { enableDarkMode ? ColorToInt(0, 0, 0) : ColorToInt(255, 255, 255) };

		// 레지스트리 변경
		try
		{
			using (RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize", true))
			{
				if (key != null)
				{
					key.SetValue("AppsUseLightTheme", mode, RegistryValueKind.DWord);
					key.SetValue("SystemUsesLightTheme", mode, RegistryValueKind.DWord);
				}
			}

			// 변경 사항 적용
			SendNotifyMessageW((IntPtr)0xFFFF, WM_SETTINGCHANGE, 0, "ImmersiveColorSet");

			// 바탕 화면 색상 즉시 변경 (레지스트리는 수정 안함)
			SetSysColors(1, new int[] { COLOR_DESKTOP, }, colors);
		}
		catch (Exception ex)
		{
			Console.WriteLine("Error updating registry: " + ex.Message);
		}
	}

	static async Task Main()
	{
		Console.WriteLine("다크 모드 활성화 중...");
		SetDarkMode(true); // 다크 모드 활성화
		await Task.Delay(TimeSpan.FromSeconds(5d)); // 5초 후 라이트 모드로 변경 (테스트용)

		Console.WriteLine("라이트 모드 활성화 중...");
		SetDarkMode(false); // 다크 모드 해제
		await Task.Delay(TimeSpan.FromSeconds(5d)); // 5초 후 라이트 모드로 변경 (테스트용)
	}
}

rkttu avatar Mar 17 '25 00:03 rkttu