私は、アプリケーションDPIに対応している問題をテストするためにDelphi XE7を使用しています。WM_DPICHANGEメッセージを受信しませんでした
タスクの1つは、ウィンドウが異なるDPI値を持つモニターに移動されたときに生成されるWM_DPICHANGEメッセージに応答することです。私はマルチモニタを設定していないので、このメッセージを生成する非常に簡単なテストプログラムを作成しましたが、Windows 8.1プラットフォームでは受信されません。これは、次のプログラムがこれを証明するのWindows 7上で動作しますOK:
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設定を持つ2台目のモニターを持たなくても、どのように応答するかをテストする方法はありません。それは、Androidデバイスやシミュレータを持たずにAndroidアプリを書くようなものです。あなたがすることは単純な推測であり、失敗することになります。 –
また、[このドキュメントは(https://msdn.microsoft.com/en-us/library/windows/desktop/dn312083%28v=vs.85%29.aspx)を読むと、このメッセージは'PROCESS_PER_MONITOR_DPI_AWARE'に登録されているアプリケーションによって受信される可能性があります。 –