关于delphi:如何获得多显示器方向

 2021-04-27 

How to get multi monitor orientations

delphi(Delphi)6。
Windows 10

默认InputQuery在主窗体的中心打开。
我正在创建自己的InputQuery,它将在调用表单的中心打开。

几乎可以使用。

问题是在旋转90度以获取人像模式的显示器上,
返回屏幕的高度和宽度,就好像监视器仍处于横向模式一样。

我尝试过:
-将Position设置为poOwnerFormCenter,可以使用,但始终在主监视器上显示。
-在正确的监视器上计算Form.Left和Form.Right可以正常工作,但是X和Y被交换了。
当屏幕高度和宽度属性始终被交换时,此操作将失败。

无法弄清楚该如何解决,
我决定在纵向模式下交换高度和宽度。

在一个论坛上,我找到并修改了读取监视器数据的功能
希望能够确定监视器处于哪种模式。
我也做不到
我也无法识别调用我的功能的显示器(我在纵向模式下有4、3)。

EnumDisplaySettings返回的数据始终为
不论显示器如何:
-身高= 640
-宽度= 480
-方向= 0

有人可以看到我做错了吗?
AddToLog过程将在备注中显示字符串。
代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
procedure TXIO_Configurator_form.Button1Click(Sender: TObject);
var
  lpDisplayDevice: TDisplayDevice;
  dwFlags        : DWORD;
  cc             : DWORD;
  DevMode        : TDeviceMode;
  S              : string;
begin
  lpdisplaydevice.cb := sizeof(lpdisplaydevice);
  dwflags := 0;
  cc:= 0;

while EnumDisplayDevices(nil, cc, lpDisplayDevice , dwFlags) do
  begin  
    EnumDisplaySettings(lpDisplayDevice.DeviceName, 0, DevMode);

    S := 'Height = ' + IntToStr(DevMode.dmPelsHeight);    // Always 640
    MainForm.AddToActivityLog(S, False);

    S := 'Width  = ' + IntToStr(DevMode.dmPelsWidth);     // Always 480  
    MainForm.AddToActivityLog(S, False);

    S := 'Orient = ' + IntToStr(DevMode.dmOrientation);   // Always 0  
    MainForm.AddToActivityLog(S, False);


    inc(cc);
  end;


让我为您的实际问题提供解决方案。

I tried:
- Setting Position to poOwnerFormCenter, worked but always ended up on the primary monitor.

好吧,poOwnerFormCenter应该可以工作。但是您必须指定所有者。

例如,

1
2
3
4
5
6
7
8
9
10
11
procedure TForm1.Button1Click(Sender: TObject);
var
  dlg: TMyDialog;
begin
  dlg := TMyDialog.Create(Self);
  try
    dlg.ShowModal;
  finally
    dlg.Free;
  end;
end;

将所有者作为构造函数的参数传递,在本例中为Self。这是"所有者表单中心"中所指的"所有者"。