C# 윈도우폼을 만들다 보면 레이아웃 크기는 어찌저찌 맞춰지는데 결과적으로 빌드된 프로그램의 레이아웃 혹은 폰트가 흐릿하게 보이는 현상을 발견했다. 이를 해결하기 위해서 네이버 지식인에 질문했더니 SetProcessDPIAware을 호출하면 가능하다는 답변을 받았다. MSDN에 나와있다고 하지만 한글로 번역이 안되서 답답했다.

결론은 해결 방법이 2가지가 있다. 소스코드에 삽입 방법과 매니페스트 파일에 삽입하는 방식인데, 매니페스트 파일에 넣는것을 권장한다는 말이 덧붙혀져 있었다. 매니페스트 파일에 대해서는 아는게 없어서 검색을 해본 뒤 작업했고 성공했다.


소스코드 삽입

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsClock
{
    static class Program
    {
        [STAThread]
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        private static extern bool SetProcessDPIAware();
        static void Main()
        {
            if (Environment.OSVersion.Version.Major >= 6) // 6->windows vista
                SetProcessDPIAware();
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

12, 13, 16, 17행에 해당하는 소스코드가 해당 동작을 수행한다.


매니페스트 파일 기입

1
2
3
4
5
6
7
8
9
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
...
  <asmv3:application>
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
      <dpiAware>true</dpiAware>
    </asmv3:windowsSettings>
  </asmv3:application>
...
</assembly>

위 코드를 매니페스트 파일에 기입하면 된다.


삽입 방법

프로젝트를 연뒤, 프로젝트 속성→보안→ClickOnce 보안 설정 체크

그럼 해당 프로젝트 폴더에서 Properties 폴더로 이동하면 위와같이 app.manifest 파일이 생성

그럼 해당 파일을 뭘로든 열어서 수정


Ref

MSDN, “SetProcessDPIAware function”, LINK

WRITTEN BY

배진오

소비적인 일보단 생산적인 일을 추구하며, 좋아하는 일을 잘하고 싶어합니다 :D
im@baejino.com