德尔福在1920x1080以上获得错误的显示器分辨率,为什么?

时间:2015-04-06 19:27:26

标签: delphi

当分辨率超过1920x1080时,我的delphi(7或XE5)应用程序的显示器分辨率会出错。

我有一本三星超级书,分辨率为2560x1440,运行Windows 8.1

当我运行简单的分辨率测试时,应用程序以1920x1080及更低的速度返回,但是当运行最大分辨率为2560x1440的应用程序时,返回的分辨率为1600x900。

这是代码,我尝试使用dpiaware manifest并获得相同的错误结果,对此有何看法?

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function GetDesktopArea: TRect;
var
  m: integer;
  USCR: TScreen;
begin
  USCR := TScreen.Create(Application);
  try
    with USCR do
    if MonitorCount = 1 then
      Result := WorkAreaRect
    else
    begin
      for m:=0 to MonitorCount-1 do
      begin
        with Monitors[m] do
          if Primary then
            Result := Rect(Left, Top, Left+Width, Top+Height);
         // UpdScreen.Monitors[m].BoundsRect;
      end;
    end;
  finally
    USCR.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  msg : String;
  scr : TRect;
begin
  scr := GetDesktopArea;

  msg := Format('Left:%d Top:%d -- W:%d H:%d', [scr.Left, scr.Top, scr.Width, scr.Height] );

  Memo1.Lines.Add( msg );
end;

end.

由于

1 个答案:

答案 0 :(得分:1)

可能的解释是您的应用程序不是dpi意识,所以体验dpi虚拟化。我知道其他任何可能影响这些系统API调用的内容。

您声明您已表明应用程序是dpi意识到的。由于证据表明您的应用程序不是dpi意识,因此我得出结论,您已经错误地应用了清单。

不要实例化TScreen。请改用Screen全局变量。