Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 GetScaleFactorForMonitor - неверное значение  [new]
Oleg6619
Member

Откуда:
Сообщений: 434
Добрый день!
Есть Windows10 с установленным масштабом <>100%.
Для определения этого параметра использую GetScaleFactorForMonitor.
Если установлен 125%, то функция возвращает 100.
Если - 150 или 175%, то - 140.

GetDpiForMonitor всегда выдает 96dpi.

Где "собака порылась"?
Использую Delphi2007, но т.к. GetScaleFactorForMonitor вызываю из DLL, то это не принципиально.
19 сен 19, 09:59    [21973917]     Ответить | Цитировать Сообщить модератору
 Re: GetScaleFactorForMonitor - неверное значение  [new]
ziv-2014
Member

Откуда:
Сообщений: 468
Oleg6619,
https://docs.microsoft.com/ru-ru/windows/win32/api/shtypes/ne-shtypes-device_scale_factor
https://docs.microsoft.com/en-us/windows/win32/api/shellscalingapi/nf-shellscalingapi-getscalefactorformonitor

typedef enum DEVICE_SCALE_FACTOR {
DEVICE_SCALE_FACTOR_INVALID,
SCALE_100_PERCENT,
SCALE_120_PERCENT,
SCALE_125_PERCENT,
SCALE_140_PERCENT,
SCALE_150_PERCENT,
SCALE_160_PERCENT,
SCALE_175_PERCENT,
SCALE_180_PERCENT,
SCALE_200_PERCENT,
SCALE_225_PERCENT,
SCALE_250_PERCENT,
SCALE_300_PERCENT,
SCALE_350_PERCENT,
SCALE_400_PERCENT,
SCALE_450_PERCENT,
SCALE_500_PERCENT
} ;
19 сен 19, 11:54    [21974050]     Ответить | Цитировать Сообщить модератору
 Re: GetScaleFactorForMonitor - неверное значение  [new]
ziv-2014
Member

Откуда:
Сообщений: 468
https://stackoverflow.com/questions/31348823/getscalefactorformonitor-value-doesnt-match-actual-scale-applied
19 сен 19, 11:56    [21974056]     Ответить | Цитировать Сообщить модератору
 Re: GetScaleFactorForMonitor - неверное значение  [new]
Oleg6619
Member

Откуда:
Сообщений: 434
Спасибо, но я это всё читал.

В переписке говорится, что DPI=144. А у меня GetDpiForMonitor тоже выдает 96dpi.

И никак с этим не справится.

Windows10 - последней сборки (Win32 will only return the correct value for version 1703 (Creator's Update)), так что должна по идее выдавать правильно. Но на деле.....
19 сен 19, 12:19    [21974087]     Ответить | Цитировать Сообщить модератору
 Re: GetScaleFactorForMonitor - неверное значение  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 915
А если такую процедурку сперва вызвать:

procedure CallSetProcessDPIAware;
var
  SetProcessDPIAware: function: Boolean; stdcall;
  H: THandle;
begin
  H := GetModuleHandle('User32.dll');
  if H > 0 then
  begin
    @SetProcessDPIAware := GetProcAddress(H, 'SetProcessDPIAware');
    if Assigned(SetProcessDPIAware) then
      SetProcessDPIAware();
  end;
end;
19 сен 19, 12:36    [21974114]     Ответить | Цитировать Сообщить модератору
 Re: GetScaleFactorForMonitor - неверное значение  [new]
Oleg6619
Member

Откуда:
Сообщений: 434
DmSer
А если такую процедурку сперва вызвать:

procedure CallSetProcessDPIAware;
var
  SetProcessDPIAware: function: Boolean; stdcall;
  H: THandle;
begin
  H := GetModuleHandle('User32.dll');
  if H > 0 then
  begin
    @SetProcessDPIAware := GetProcAddress(H, 'SetProcessDPIAware');
    if Assigned(SetProcessDPIAware) then
      SetProcessDPIAware();
  end;
end;


А вот это помогло.
Спасибо!
19 сен 19, 12:47    [21974127]     Ответить | Цитировать Сообщить модератору
 Re: GetScaleFactorForMonitor - неверное значение  [new]
Belotsky Serge
Member

Откуда: Гомель
Сообщений: 282
Oleg6619,
Не знаю, как в 2007, но в XE3 есть глобальная переменная Screen :TScreen;
        H1 := Screen.PixelsPerInch; // получить текущее DPI экрана
19 сен 19, 14:04    [21974274]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить