编辑- 见最后更新
这是针对 Delphi 7.0 Build 4.453
概括
我需要能够从作为 HMONITOR 的 TMonitor 对象(TScreen 组件中的 Monitors 数组中的一个元素)获取 Handle 属性,并将其转换为您将在调用EnumDisplaySettings 时用作 lpszDeviceName 参数的字符串。
(我的最终目标是通过将解析的 lpszDeviceName 传递给对 EnumDisplaySettings 的调用,从给定的 HMONITOR 值中获取设备设置列表)。
详细资料
如上所述,Screen.Monitors[x].Handle 属性是 HMONITOR 类型,通常用于传递给GetMonitorInfo函数,该函数返回几何信息,但没有 lpszDeviceName。(注意:有一个TMonitorInfoEx结构,它有一个 szDevice 字段,但它似乎没有在我的系统上填写,即使我将 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;