TransformToDevice не возвращает правильный коэффициент DPI в Windows 8.1

Привет, я реализую приложение с поддержкой DPI, где я хочу рассчитать положение окна на основе текущего разрешения.

Я протестировал приведенный ниже код в Windows 8.1, где ОС не запрашивает повторный вход в систему, если мы изменим настройку DPI. он применяет DPI немедленно.

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

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

но если я изменяю DPI с помощью mspanel без выхода из системы и повторного входа в систему, TransformToDevice() возвращает старое значение вместо нового. Я думал, что эта матрица преобразования изменится, если изменятся настройки DPI.

Есть ли метод, который я должен вызывать при изменении настроек DPI?


person user3106005    schedule 09.10.2014    source источник
comment
работает после выхода/повторного входа?   -  person kennyzx    schedule 09.10.2014
comment
да, это работает после выхода из системы и повторного входа в систему.   -  person user3106005    schedule 09.10.2014
comment
пожалуйста, помогите здесь. есть ли какой-либо другой API, который вернет правильное значение DPI или текущее разрешение? Я пробовал другие GetDeviceCaps(), GetSystemMatrics() и GetMonitorInfo(), но все они возвращают значение, которое было установлено до выхода из системы, а не возвращают текущее установленное значение.   -  person user3106005    schedule 16.10.2014


Ответы (1)


Я не уверен в настройках DPI в вашей среде, но, поскольку вы говорите об изменении DPI «без выхода из системы и повторного входа в систему», я предполагаю, что функция DPI для каждого монитора в Windows 8.1 включена.

В среде Per-Monitor DPI, DPI монитора можно изменить мгновенно без выхода из системы и повторного входа в систему, тогда как системный DPI не будет следовать за изменением до выхода из системы и повторного входа в систему. Ваш код (хотя он кажется неполным) чтобы получить системный DPI. Вместо этого вам нужно использовать GetDpiForMonitor с помощью P/Invoke. чтобы получить текущий DPI монитора.

person emoacht    schedule 23.11.2014