Получить текущее / родное разрешение экрана всех мониторов в Delphi (DirectX) - PullRequest
3 голосов
/ 16 августа 2011

наше приложение delphi может иметь несколько окон DirectX, часто на нескольких экранах. до сих пор пользователю приходилось указывать полноэкранное разрешение, используя выпадающий список поддерживаемых разрешений. было бы очень хорошо, если бы он мог использовать такую ​​настройку, как «текущая», которая была бы разрешением экрана, на котором находится окно.

мы используем delphi с заголовками clootie directX. Может кто-нибудь дать мне подсказку, как я мог бы написать метод, используя методы DirectX, WinAPI или Delphi, чтобы получить разрешение текущего экрана, на котором окно?

С уважением, thalm

Окончательное решение:

хорошо, delphi 2007 MultiMon.pas возвращает дерьмо для GetMonitorInfo, , поэтому я нашел этот метод, который работает для меня, используя winAPI напрямую:

function GetRectOfMonitorContainingRect(const R: TRect): TRect;
{ Returns bounding rectangle of monitor containing or nearest to R }
type
  HMONITOR = type THandle;
  TMonitorInfo = record
    cbSize: DWORD;
    rcMonitor: TRect;
    rcWork: TRect;
    dwFlags: DWORD;
  end;
const
  MONITOR_DEFAULTTONEAREST = $00000002;
var
  Module: HMODULE;
  MonitorFromRect: function(const lprc: TRect; dwFlags: DWORD): HMONITOR; stdcall;
  GetMonitorInfo: function(hMonitor: HMONITOR; var lpmi: TMonitorInfo): BOOL; stdcall;
  M: HMONITOR;
  Info: TMonitorInfo;
begin
  Module := GetModuleHandle(user32);
  MonitorFromRect := GetProcAddress(Module, 'MonitorFromRect');
  GetMonitorInfo := GetProcAddress(Module, 'GetMonitorInfoA');
  if Assigned(MonitorFromRect) and Assigned(GetMonitorInfo) then begin
    M := MonitorFromRect(R, MONITOR_DEFAULTTONEAREST);
    Info.cbSize := SizeOf(Info);
    if GetMonitorInfo(M, Info) then begin
      Result := Info.rcMonitor;
      Exit;
    end;
  end;
  Result := GetRectOfPrimaryMonitor(True);
end;

Ответы [ 3 ]

7 голосов
/ 16 августа 2011
var
  MonInfo: TMonitorInfo;
begin
  MonInfo.cbSize := SizeOf(MonInfo);
  GetMonitorInfo(MonitorFromWindow(Handle, MONITOR_DEFAULTTONEAREST), @MonInfo);
  ShowMessage(Format('Current resolution: %dx%d',
              [MonInfo.rcMonitor.Right - MonInfo.rcMonitor.Left,
               MonInfo.rcMonitor.Bottom - MonInfo.rcMonitor.Top]));
2 голосов
/ 16 августа 2011

См. API GetDeviceCaps для получения разрешения экрана.

Используйте свойство TCustomForm.Monitor , чтобы получить монитор , на котором отображается форма.

0 голосов
/ 16 августа 2011

Сначала используйте EnumDisplayDevices для получения списка всех имен мониторов, см. этот пост usenet, чтобы узнать, как это сделать в Delphi. Обратите внимание, что вы хотите DeviceName, а не DeviceString.

Затем для каждого монитора используйте EnumDisplaySettings(lpDisplayDevice.DeviceName, ENUM_CURRENT_SETTINGS, lpDevMode) для получения текущих настроек. Здесь вы также можете использовать NULL в качестве имени устройства, что означает: «Значение NULL указывает текущее устройство отображения на компьютере, на котором работает вызывающий поток.». Это обычно должно соответствовать монитору, на котором в данный момент находится пользователь.

...