Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 未收到WM_DPICHANGE消息_Windows_Delphi_Dpi - Fatal编程技术网

Windows 未收到WM_DPICHANGE消息

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

我正在使用DelphiXe7测试使应用程序DPI感知的问题

任务之一是响应WM_DPICHANGE消息,当窗口移动到具有不同DPI值的监视器时,应生成该消息。我没有设置多监视器,所以我编写了一个非常简单的测试程序来生成此消息,但在windows 8.1平台上没有收到此消息。它在Windows7上运行正常。以下程序演示了这一点:

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在处理此问题时提供的建议 信息

如果您向异步用户发送WM_以下范围的消息 消息函数(PostMessage、SendNotifyMessage和 SendMessageCallback),其消息参数不能包含指针。 否则,操作将失败。函数将在 接收线程有机会处理消息和 发送方将在使用内存之前释放内存

如果将代码中的
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在处理此问题时提供的建议 信息

如果您向异步用户发送WM_以下范围的消息 消息函数(PostMessage、SendNotifyMessage和 SendMessageCallback),其消息参数不能包含指针。 否则,操作将失败。函数将在 接收线程有机会处理消息和 发送方将在使用内存之前释放内存

如果将代码中的
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应用程序一样;你所做的任何事情都是简单的猜测,注定会失败。而且,你读到了上面写着这条消息的地方