winform DPI 배율(스케일링) 문제.

글을 작성 시점은 2020년 6월 입니다.
DPI 지원 부분이 계속해서 변경되고 있기 때문에 작성 시점을 밝힙니다.
----------------------------------------------------------------------

HiDpi를 지원하는 몇가지 방법이 있습니다.
- 매니페스트(app.manifest)
- App.config
- API 호출.

세가지 방법 모두 manifest Windows 10 설정이 윈도우 보안기능(SmartScreen 등)에 날아가(?) WM_DPICHANGED(윈폼에선 DpiChanged)등 관련 콜백들이 제대로 동작하지 않는게 프로그램이 Windows 10 호환모드로 실행되지 않는거 같습니다.
그나마 SetProcessDpiAwarenessContext 호출시 글로벌후킹한 마우스 좌표값이 제대로 들어왔습니다. 이때 UI 스케일링은 자동으로 이뤄지지 않았고 DpiChanged 콜백도 동작하지 않았습니다.

윈도우 DPI 배율 기능이 땜빵같이 들어가 여기저기 엉켜 있는거 같네요.
윈도우 API로 짜면 어떨까 싶기도 합니다.


개발용 인증서를 사인해 봤지만 이걸로는 안됐습니다.
검색해 보니 아래와 같은 방법이 있지만 해결될지는 미지수 입니다.

신뢰할 수있는 기관 (digicert, symantec, ...)에서 인증서를 구매하고 이를 실행파일에 서명.
Windows 스토어에서 소프트웨어 배포.
PC에서 스마트 스크린 필터 해제.

----------------------------------------------------------------------

매니페스트(app.manifest), App.config 두 방법 모두 manifest의 설정이 중요합니다.
<!-- Windows 10  -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />

app.manifest에 설정되어 있지 않으면 제대로 동작하지 않습니다.

----------------------------------------------------------------------

App.config 방법은 가장 잘 동작했습니다.
그런데 배포시 다른 컴퓨터에서 SmartScreen(윈도우 보안기능)에 걸려 제대로 동작하지 않습니다. 증상이 manifest Windows 10 설정이 안되어 있을때와 비슷합니다.


Winform HiDPI scale지원. 마우스좌표오류. Winform에서 DpiChanged 이벤트가 호출되지 않을때. 
https://abel9999.blogspot.com/2020/06/winform-form1dpichanged.html

----------------------------------------------------------------------

manifest 방법도 SmartScreen(윈도우 보안기능)에 걸리면 제대로 동작하지 않습니다.
App.config 방법보다 약간 불안정 합니다.
Winform의 UI가 깨지는 증상이 간혹 있었습니다.

Setting the default DPI awareness for a process

----------------------------------------------------------------------

API 호출.

SetProcessDpiAwarenessContext, SetThreadDpiAwarenessContext.
저는 SetProcessDpiAwarenessContext 를 호출했습니다.
SetThreadDpiAwarenessContext이 권장인데 잘 안되더군요.

혼합 모드 DPI 스케일링 및 DPI 인식 API

High DPI Reference

DPI_AWARENESS_CONTEXT handle

Application Manifests

댓글

이 블로그의 인기 게시물

파이썬 vscode에서 자동 코드 정렬. Formatter.

Unity3D git 저장소에 올릴때 필요없는 파일 제외하기. gitignore

플러터(flutter) 개발 참고 사이트들.