Ich benutze Delphi XE7, um die Probleme zu testen, die eine Anwendung DPI bewusst machen.WM_DPICHANGE Nachricht nicht empfangen
Eine der Aufgaben besteht darin, auf die WM_DPICHANGE-Nachricht zu reagieren, die generiert werden soll, wenn ein Fenster auf einen Monitor mit einem anderen DPI-Wert verschoben wird. Ich habe kein Multi-Monitor-Setup, also schrieb ich ein sehr einfaches Testprogramm, das diese Nachricht generiert, aber es wird nicht auf einer Windows 8.1-Plattform empfangen. Es funktioniert OK auf Windows 7. Das folgende Programm veranschaulicht dies:
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.
Die Showmessage erscheint nicht, wenn unter Windows 8.1 ausgeführt werden. Ist etwas essen die Nachricht, bevor es mein Programm trifft?
Sie haben keine Chance, irgendetwas ohne mehrere Monitore zu erreichen –
Dies wird nichts erreichen. Selbst wenn Sie die Nachricht abfangen könnten, können Sie nicht testen, wie Sie darauf reagieren, ohne einen zweiten Monitor mit einer anderen DPI-Einstellung zu haben. Es ist so, als würde man versuchen, eine Android-App zu schreiben, ohne ein Android-Gerät oder einen Simulator zu haben; Alles, was Sie tun, ist ein einfaches Raten und muss scheitern. –
Auch lesen Sie [die Dokumentation] (https://msdn.microsoft.com/en-us/library/windows/desktop/dn312083%28v=vs.85%29.aspx) wo es heißt, dass diese Nachricht nur von Anwendungen empfangen werden, die sich als "PROCESS_PER_MONITOR_DPI_AWARE" registriert haben, richtig? –