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

tha*_*alm 4 delphi directx multiple-monitors screen-resolution

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

我们正在使用带有clootie directX标头的delphi.有人可以给我一个提示,我将如何使用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;
Run Code Online (Sandbox Code Playgroud)

Ser*_*yuz 8

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]));
Run Code Online (Sandbox Code Playgroud)

  • 请参阅我的帖子以获取完整的解决方案,它只能直接使用 winAPI,因为 delphi 2007 在这里似乎有问题。 (2认同)