
윈도우 바탕화면 정리 프로그램을 소개합니다.
프로그램 이름은 Ghostyak Boxes이고요,
공식 홈페이지는 https://www.ghostyak.com 입니다
Stardock Fences와 비슷한 컨셉인데, 바로가기를 등록해서 사용합니다.
Win+D 키를 눌러도 숨겨지지 않습니다.
오른쪽 사진뷰어는 위젯 같은 개념인데, 사진을 박스에 등록한 후 재생하면 저렇게 나옵니다.
사진이 들어있는 폴더를 넣으면 슬라이드 되고요.
가족사진이나 암기용 단어장 재생용입니다.
전직 개발자이고요, 바이브코딩으로 만들었습니다.
마이크로소프트 Learn의 고해상도 데스크톱 앱 문서에 표로 정리되어 있는데, 하나의 창 트리 안에서는 모든 HWND가 같은 DPI 인식 모드여야 하고 이 규칙을 깨면 프로세스 전체의 DPI 인식이 강제로 초기화됩니다. 같은 프로세스 안에서의 SetParent는 윈도우 10 1703 이상에서 ERROR_INVALID_STATE로 실패하고, 프로세스가 다른 경우에는 자식 쪽 프로세스의 DPI 인식이 리셋된다고 되어 있습니다. 바탕화면 창은 탐색기 소유라 후자에 해당합니다.
여기 걸리면 그 자리에서 티가 안 나고, 배율이 다른 모니터로 옮겼을 때 사진 뷰어만 흐려지거나 박스 좌표가 밀리는 식으로 나옵니다. 시스템 DPI 인식 상태에서는 다른 배율 화면으로 창이 넘어갈 때 윈도우가 비트맵을 늘려버린다고 같은 문서에 적혀 있습니다.
박스 위치를 저장했다가 복원하는 구조일 텐데, 모니터를 뺐다 꽂거나 배율을 바꾸면 좌표를 어떤 기준으로 되살리시나요. 그리고 Win+D 회피는 부모 창을 바꾸는 방식인가요, 아니면 z 순서만 따로 잡아두시는 건가요.
상세구현은 모두 AI에게 맡겼고 저는 요구만 했습니다.
이럴땐 이렇게 동작해야한다고요.
첨엔 흉내만 내더니 구체적으로 요구할수록 원하는 결과물이 나왔습니다.
DPI 관련 문제는 있었지만 지금은 고쳐졌다고 생각합니다.
열심히 개밥먹으면서 판올림 하고 있는데 생각지도 못한 오류가 계속 나오더라고요.
리팩터링 하면서 한걸음씩 전진하고 있습니다.
개발한당에 글 쓸 당시에는 초기 릴리즈 버전이 v0.3.22 였던 것 같은데,
지금 버전은 v0.3.38입니다.
깃헙에서 릴리즈 하고 있고요,
혹시 예전 버전을 사용하셨다면 최신버전에서는 문제가 해결되었을 겁니다.
아래 링크를 둘러봐주세요
https://github.com/ghostyak/boxes/releases
Win+D 회피는 탐색기의 자식 프로세스로 주입하는 방식을 이용했습니다. 음.. 이용했다고 들었습니다. ^^
DPI 쪽은 고쳤는지 확인하기가 애매한 종류라, 재현 조건을 아예 목록으로 박아두시는 편이 나중에 덜 고생하실 것 같습니다. 마이크로소프트 Learn 의 고해상도 데스크톱 앱 문서에 검증 항목이 네 가지로 나와 있는데, 배율이 다른 디스플레이 사이로 창 옮기기, 배율이 다른 디스플레이에서 앱 시작하기, 앱이 도는 중에 모니터 배율 바꾸기, 그리고 주 디스플레이를 바꾼 뒤 로그아웃했다가 다시 로그인해서 확인하기입니다. 마지막 항목은 하드코딩된 크기를 찾는 데 특히 쓸모 있다고 문서가 따로 적어두고 있습니다.
생각지도 못한 오류가 계속 나온다고 하신 부분에서 하나 짚이는 게 있는데, 같은 문서의 흔한 실수 항목 첫 번째가 WM_DPICHANGED 가 같이 넘겨주는 권장 사각형을 안 쓰는 경우입니다. 그 값을 무시하고 크기를 직접 계산하면 DPI 변경이 또 다른 DPI 변경을 부르는 재귀 루프에 빠질 수 있다고 되어 있습니다. 사정상 그 사각형을 못 쓰면 WM_GETDPISCALEDSIZE 로 원하는 크기를 미리 돌려주는 우회가 따로 있습니다.
사진 뷰어 쪽도 하나 있습니다. 같은 문서의 프레임워크 표에서 GDI 와 GDI+ 는 모니터별 DPI 지원이 없음으로 되어 있어서, 뷰어를 그쪽으로 그리셨다면 배율 대응이 통째로 앱 몫이 됩니다.
박스 좌표는 물리 픽셀로 저장하시나요, 아니면 96 기준 논리 좌표로 저장하시나요. 모니터를 뺐다 꽂거나 배율을 바꿨을 때 복원 결과가 여기서 갈릴 것 같아 궁금합니다.
자세한 조언 감사합니다. DPI 문제는 제 환경에서 괜찮아 보여도 다른 환경에서는 다시 나타나서 확인이 쉽지 않더라고요. 말씀해 주신 네 가지 조건을 체크리스트로 만들어서 검증해 보겠습니다.
모니터 연결을 해제했다가 다시 연결하는 경우도 함께 확인해 봐야겠네요.
막연하게 테스트하던 부분인데, 구체적으로 짚어 주셔서 도움이 많이 됐습니다.