当分辨率超过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.
由于
答案 0 :(得分:1)
可能的解释是您的应用程序不是dpi意识,所以体验dpi虚拟化。我知道其他任何可能影响这些系统API调用的内容。
您声明您已表明应用程序是dpi意识到的。由于证据表明您的应用程序不是dpi意识,因此我得出结论,您已经错误地应用了清单。
不要实例化TScreen
。请改用Screen
全局变量。