6

編集- 最後に更新を参照してください

これは、Delphi 7.0 ビルド 4.453 用です。

概要

HMONITOR である TMonitor オブジェクト (TScreen コンポーネントの Monitors 配列の要素) から Handle プロパティを取得し、それを EnumDisplaySettings の呼び出しで lpszDeviceName パラメータとして使用する文字列に変換できるようにする必要があります。

(私の最終目標は、解決された lpszDeviceName を EnumDisplaySettings の呼び出しに渡すことによって、特定の HMONITOR 値からデバイス設定のリストを取得することです)。

詳細な情報

前述のように、Screen.Monitors[x].Handle プロパティは HMONITOR 型であり、通常はGetMonitorInfo関数に渡すために使用されます。この関数はジオメトリ情報を返しますが、lpszDeviceName は返しません。(注: szDevice フィールドを持つTMonitorInfoEx構造体がありますが、cbSize フィールドを適切なサイズに設定しているにもかかわらず、システムに入力されていないようです)。

あるいは、szDeviceName を使用して同等の HMONITOR 値を取得できる場合は、それを次の関数にプラグインして比較に使用することができます (以下のコードにhMonitorFromDeviceNameという架空の関数への呼び出しを挿入しました)。それは使用されます。

function GetMonitorDeviceName(hmon : HMONITOR) : string;
var
  DispDev : TDisplayDevice;
  deviceName : string;
  nDeviceIndex : integer;
begin
  Result := '';

  FillChar(DispDev, sizeof(DispDev),0);
  DispDev.cb := sizeof(DispDev);

  nDeviceIndex := 0;
  while (EnumDisplayDevices(nil, nDeviceIndex, DispDev, 0)) do
  begin

     if ( hMonitorFromDeviceName(DispDev.DeviceString) = hmon ) then
     begin
        Result := StrPas(DispDev.DeviceString);
        exit;
     end;

     inc(nDeviceIndex);

  end;
end;

アップデート

David Heffernan のおかげで、私は彼のソリューションをテストしました。以下は、特定のハンドルからモニター名を取得するサンプル関数です。

function GetMonitorName(hmon : HMONITOR) : string;
type
  TMonitorInfoEx = record
    cbSize: DWORD;
    rcMonitor: TRect;
    rcWork: TRect;
    dwFlags: DWORD;
    szDevice: array[0..CCHDEVICENAME - 1] of AnsiChar;
end;
var
  DispDev : TDisplayDevice;
  deviceName : string;
   monInfo : TMonitorInfoEx;
begin
  Result := '';

  monInfo.cbSize := sizeof(monInfo);
  if GetMonitorInfo(hmon,@monInfo) then
  begin

    DispDev.cb := sizeof(DispDev);
     EnumDisplayDevices(@monInfo.szDevice, 0, DispDev, 0);
     Result := StrPas(DispDev.DeviceString);

  end;
end;
4

1 に答える 1