WPF앱 Windows DPI이슈

화면 Capture 앱을 WPF로 만들고 있습니다.

DPI문제에서 막혔습니다.

다음과 같이 범위를 지정해서 찍으면

다음과 같이 찍힙니다.

제 모니터 해상도가 3840 * 2160인데 배율을 200%로 써서 WPF는 논리좌표인 그 1/4인 1920 * 1280으로 작동하는 것 같습니다 해결 방법을 AI도 추천해 줬으나 해당 방법을 적용하여 해결하지 못하였습니다.

해본것은 다음과 같이 manifest를 작성하여 추가 해보았으나 여전합니다.

1. app.manifest에 DPI Awareness 선언
<!-- app.manifest -->
<application xmlns="urn:schemas-microsoft-com:asm.v3">
  <windowsSettings>
    <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
      PerMonitorV2
    </dpiAwareness>
    <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
      True/PM
    </dpiAware>
  </windowsSettings>
</application>

AI에 여러차례 질문하고 코드에 적용해보았으나 알기 힘들어 실례를 무릅쓰고 질문 드립니다. 바쁘신데 읽어주셔서 감사합니다.

1 Like

Fix WPF high-DPI capture: Per-Monitor V2 manifest + drag rectangle tracking by christian289 · Pull Request #1 · Kyeongrok/capture-agent

문법 문제였던 것 같네요. Claude Code Opus 4.8 이 작업한 코드를 PR로 제출했습니다.

4 Likes

이게 맞는지는 잘 모루겠지만…

wpf 의 diu 와 ppi 관련된 내용을 검색해보면

요로케 나오긴 하네요.

근본적으로는 지식적인 측면도 필요하겠죵??

정성태님의 글이 제일 공부하기 좋은 거 같네요.

뭔가 ai 한테 물린 사람들 모임이라도 해야하나 싶은 생각도 드는 군요..
(오늘도 저는 ai 의 구라를 판독하느라 시간을 다 씁니다…)

5 Likes

WPF 는 DP 단위이고 화면 캡쳐는 픽셀단위이기 때문에 DP <=> 픽셀값 변환을 해서 사용하셔야 합니다. DPI Awareness 설정을 해야 하는 이유는 DPI Awareness 설정을 해야 WPF 앱에서 현재 윈도우의 확대 배율을 알 수 있기 때문입니다. 확대 배율을 알면 DP <=> 픽셀값 변환이 가능합니다.

계산이 귀찮으시면 다음 nuget 패키지 사용하시면 됩니다. 편리하죠^^

4 Likes

감사합니다 Merge 했습니다.

영역 지정 할 때 dpi적용 안되던 문제는 불편하지만 그냥 써야겠다고 생각 했었는데 이 부분도 해결 해주셔서 감사드립니다.

3 Likes

알려주신 링크의 글 잘 봤습니다. 역시 펫졸드의 글을 인용 했네요.

제가 이 캡춰 앱을 만든 이유가 fliphtml5.com/lciv/ypxy 펫졸드의 WPF책이 절판이 되어 이 사이트에서 밖에 볼 수가 없는데 보기가 불편해서 찍어서 OCR해서 코드만 추출 하려고 만들었던 것이었습니다.

1 Like