Windows 未收到WM_DPICHANGE消息
我正在使用DelphiXe7测试使应用程序DPI感知的问题 任务之一是响应WM_DPICHANGE消息,当窗口移动到具有不同DPI值的监视器时,应生成该消息。我没有设置多监视器,所以我编写了一个非常简单的测试程序来生成此消息,但在windows 8.1平台上没有收到此消息。它在Windows7上运行正常。以下程序演示了这一点:Windows 未收到WM_DPICHANGE消息,windows,delphi,dpi,Windows,Delphi,Dpi,我正在使用DelphiXe7测试使应用程序DPI感知的问题 任务之一是响应WM_DPICHANGE消息,当窗口移动到具有不同DPI值的监视器时,应生成该消息。我没有设置多监视器,所以我编写了一个非常简单的测试程序来生成此消息,但在windows 8.1平台上没有收到此消息。它在Windows7上运行正常。以下程序演示了这一点: unit Main; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, Syste
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。在消息进入我的程序之前是否有东西正在吞噬它?
WM\u DPICHANGED
仅在Windows 8.1及更新版本上受支持
当你们说你们的代码在Windows7上运行时,实际上它的工作方式是点击按钮将消息发布到你们的窗口,你们正在捕获那个消息。另一方面,它与实际的DPI变化无关。在Windows 7上,WM_DPICHANGED被视为您发送了一些自定义消息
在Windows 8.1及更新版本上,WMdpichanged是Windows API定义的消息。使用PostMessage
发送该消息失败,错误代码为1159 error\u message\u SYNC\u ONLY
该错误意味着您无法异步发送该特定消息。这里的问题在这里的第二个参数中,它是指向Windows API中定义的WM\u DPICHANGED
消息的RECT
结构的指针
- wParam—wParam的HIWORD包含窗口新dpi的Y轴值。wParam的LOWORD包含 窗口的新DPI的X轴值。例如,96120144, 或192。X轴和Y轴的值在以下情况下相同: Windows应用程序
- lParam-指向RECT结构的指针,该结构提供为新窗口缩放的当前窗口的建议大小和位置 新闻部。人们期望应用程序能够重新定位和调整窗口大小 根据lParam在处理此问题时提供的建议 信息
PostMessage
更改为SendMessage
,则在Windows 8.1+上单击按钮也会起作用
当然,如果您正确设置了应用程序DPI感知,它通常也会处理Windows发送的
WM\u DPICHANGED
消息。WM\u DPICHANGED
仅在Windows 8.1及更新版本上受支持
当你们说你们的代码在Windows7上运行时,实际上它的工作方式是点击按钮将消息发布到你们的窗口,你们正在捕获那个消息。另一方面,它与实际的DPI变化无关。在Windows 7上,WM_DPICHANGED被视为您发送了一些自定义消息
在Windows 8.1及更新版本上,WMdpichanged是Windows API定义的消息。使用PostMessage
发送该消息失败,错误代码为1159 error\u message\u SYNC\u ONLY
该错误意味着您无法异步发送该特定消息。这里的问题在这里的第二个参数中,它是指向Windows API中定义的WM\u DPICHANGED
消息的RECT
结构的指针
- wParam—wParam的HIWORD包含窗口新dpi的Y轴值。wParam的LOWORD包含 窗口的新DPI的X轴值。例如,96120144, 或192。X轴和Y轴的值在以下情况下相同: Windows应用程序
- lParam-指向RECT结构的指针,该结构提供为新窗口缩放的当前窗口的建议大小和位置 新闻部。人们期望应用程序能够重新定位和调整窗口大小 根据lParam在处理此问题时提供的建议 信息
PostMessage
更改为SendMessage
,则在Windows 8.1+上单击按钮也会起作用
当然,如果您正确设置了应用程序DPI感知,它通常也会处理Windows发送的
WM\u DPICHANGED
消息。如果没有多个监视器,您将无法实现任何目标。这将一事无成。即使您可以捕捉到消息,如果没有另一个具有不同DPI设置的监视器,您也无法测试如何响应消息。这就像在没有Android设备或模拟器的情况下编写Android应用程序一样;您所做的一切都是简单的猜测,注定会失败。此外,您阅读了其中的内容,其中指出此消息仅会被注册为PROCESS\u PER\u MONITOR\u DPI\u AWARE
)的应用程序接收,对吗?如果没有多个监视器,您根本不可能实现任何目标。这将一事无成。即使您可以捕捉到消息,如果没有另一个具有不同DPI设置的监视器,您也无法测试如何响应消息。这就像在没有Android设备或模拟器的情况下编写Android应用程序一样;你所做的任何事情都是简单的猜测,注定会失败。而且,你读到了上面写着这条消息的地方