【发布时间】:2016-05-04 15:42:04
【问题描述】:
我正在使用 Delphi XE7 测试有关使应用程序感知 DPI 的问题。
其中一项任务是响应当窗口移动到具有不同 DPI 值的监视器时应生成的 WM_DPICHANGE 消息。我没有设置多显示器,所以我编写了一个非常简单的测试程序来生成此消息,但在 windows 8.1 平台上没有收到它。它在 Windows 7 上运行良好。以下程序演示了这一点:
unit Main;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
const
WM_DPICHANGED = 736; // 0x02E0
type
TMyForm = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure DPIChanged(var Message: TMessage); message WM_DPICHANGED;
public
{ Public declarations }
end;
var
MyForm: TMyForm;
implementation
{$R *.dfm}
procedure TMyForm.Button1Click(Sender: TObject);
begin
PostMessage(Self.Handle,WM_DPICHANGED,0,0);
end;
procedure TMyForm.DPIChanged(var Message: TMessage);
begin
ShowMessage('Message WM_DPICHANGED Received');
end;
end.
在 Windows 8.1 下运行时不显示 ShowMessage。有什么东西在消息到达我的程序之前就吃掉了它吗?
【问题讨论】:
-
如果没有多台显示器,您就没有机会实现任何目标
-
这将一事无成。即使您可以捕捉到该消息,如果没有第二台具有不同 DPI 设置的显示器,您也无法测试您如何响应它。这就像在没有 Android 设备或模拟器的情况下尝试编写 Android 应用程序一样;你所做的任何事情都是简单的猜测,注定会失败。
-
另外,你读过the documentation,它说这条消息只会被注册为
PROCESS_PER_MONITOR_DPI_AWARE的应用程序接收,对吧?