获取Delphi(DirectX)中所有显示器的当前/本机屏幕分辨率

时间:2011-08-16 11:35:25

标签: delphi directx screen-resolution multiple-monitors

我们的delphi应用程序可以有多个DirectX窗口,通常在多个屏幕上。到目前为止,用户必须使用支持的分辨率的下拉列表指定全屏分辨率。如果他可以使用像'current'这样的设置,这将是窗口的屏幕分辨率,那将是非常好的。

我们正在使用带有clootie directX标头的delphi。有人可以给我一个提示,我如何用directX,winAPI或delphi方法编写一个方法来获得窗口当前屏幕的分辨率?

亲切的问候, thalm

最终解决方案:

好的,delphi 2007 MultiMon.pas为GetMonitorInfo返回垃圾,so i found这个方法对我有用,直接使用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 个答案:

答案 0 :(得分:7)

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]));

答案 1 :(得分:2)

请参阅GetDeviceCaps API以获取屏幕分辨率。

使用TCustomForm.Monitor属性获取表单所在的monitor

答案 2 :(得分:0)

首先使用EnumDisplayDevices获取所有监视器名称的列表,有关如何在Delphi中执行此操作,请参阅this usenet post。请注意,您需要DeviceName而不是DeviceString

然后,对于每个监视器,使用EnumDisplaySettings (lpDisplayDevice.DeviceName, ENUM_CURRENT_SETTINGS, lpDevMode)来获取当前设置。在这里,您还可以使用NULL作为设备名称,这意味着:“NULL值指定运行调用线程的计算机上的当前显示设备。”这应该通常对应于用户当前所在的监视器。