2014-10-09 13 views
1

안녕하세요. DPI 인식 애플리케이션을 구현하고 있습니다. 현재 해상도를 기반으로 창의 위치를 ​​계산하고 싶습니다.TransformToDevice가 올바른 DPI 팩터를 윈도우에 반환하지 않습니다. 8.1

DPI 설정을 변경하면 OS가 다시 로그인을 요구하지 않는 Windows 8.1에서 아래 코드를 테스트했습니다. 즉시 DPI를 적용합니다. 내가 DPI가 로그 아웃하고 다시 로그인없이 mspanel를 사용하여 변경하는 경우

var presentationSource = PresentationSource.FromVisual(this); 
    transform = presentationSource.CompositionTarget.TransformToDevice; 

    int width = transform.m11 * SystemParameters.PrimaryScreenWidth; 
    int height = transform.M22* SystemParameters.PrimaryScreenHeight; 

하지만, TransformToDevice()는 이전의 값 대신 새로운 하나를 반환합니다. DPI 설정이 변경되면이 변환 행렬이 변경 될 것이라고 생각했습니다.

DPI 설정이 변경 될 때 호출 할 방법이 있습니까?

+0

로그 아웃/다시 로그인 한 후에도 작동합니까? – kennyzx

+0

예, 로그 아웃하고 다시 로그인 한 후에 작동합니다. – user3106005

+0

여기서 도와주세요. 올바른 DPI 값을 반환하거나 현재 해상도를 반환하는 다른 API가 있습니까? 다른 GetDeviceCaps(), GetSystemMatrics() 및 GetMonitorInfo()를 시도했지만 모두 로그 오프 전에 설정된 값을 반환하고 현재 설정된 값을 반환하지 않습니다. – user3106005

답변

0

환경의 DPI 설정이 확실하지 않지만 "로그 아웃 및 다시 로그인하지 않고"DPI 변경에 대해 이야기하고 있으므로 Windows 8.1의 Per-Monitor DPI 기능이 사용 가능하다고 가정합니다.

Per-Monitor DPI 환경에서 모니터 DPI는 로그 아웃 및 다시 로그인하지 않고 즉시 변경할 수 있지만 시스템 DPI는 로그 아웃하고 다시 로그인 할 때까지 변경 사항을 따르지 않습니다. 불완전하지만) 시스템 DPI를 얻는 것입니다. 대신 현재 모니터 DPI를 얻으려면 P/Invoke로 GetDpiForMonitor을 사용해야합니다.