我们的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;
答案 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值指定运行调用线程的计算机上的当前显示设备。”这应该通常对应于用户当前所在的监视器。