EDIT - Update am EndeHmonitor lösen müssen -> device (oder device -> Hmonitor) in Fenster
Siehe 7.0 Dies ist für Delphi bauen 4,453
Zusammenfassung
Ich muss in der Lage sein, die Handle-Eigenschaft von einem TMonitor-Objekt (ein Element im Monitors-Array in der TScreen-Komponente), das ein HMONITOR ist, in den String umzuwandeln, den Sie in Aufrufen von EnumDisplaySettings als LpszDeviceName-Parameter verwenden würden.
(mein Endziel ist es, eine Liste von Geräteeinstellungen von einem gegebenen HMONITOR-Wert zu erhalten, indem ich den aufgelösten lpszDeviceName in Aufrufe von EnumDisplaySettings übergebe).
Detaillierte Informationen
Wie oben erwähnt, sind die Screen.Monitors [x] .Handle Eigenschaft ist vom Typ Hmonitor und wird normalerweise verwendet, in die GetMonitorInfo Funktion zu übergeben, die zurückgibt, Geometrieinformationen, aber keine lpszDeviceName . (Hinweis: Es gibt eine TMonitorInfoEx Struktur, die ein SzDevice-Feld hat, aber es scheint nicht in meinem System ausgefüllt werden, obwohl ich das cbSize-Feld auf die entsprechende Größe festlegen).
Alternativ, wenn ich eine szDeviceName können das Äquivalent Hmonitor Wert zu erhalten, ich es in die folgende Funktion stecken könnte, was es in einem Vergleich verwenden würde (ich habe einen Aufruf an fiktive Funktion hMonitorFromDeviceName genannt eingefügt im Code unten), um anzugeben, wie es verwendet würde.
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;
aktualisieren
Dank David Heffernan, ich habe seine Lösung, getestet und hier ist eine Beispielfunktion den Monitor Namen von einem bestimmten Griff zu bekommen:
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;
Wenn ich dies auf meinem System ausführen, bekomme ich "der Parameter ist falsch" ausgelöst als Ausnahme. – unsynchronized
Das passiert, wenn 'cbSize' falsch ist. Welchen Wert von cbSize sehen Sie unter dem Debugger? Und welche Version von Delphi hast du? Da ist etwas nicht in Ordnung. Ich bin sicher, dass wir dem auf den Grund gehen können und dass der API-Aufruf für Sie funktioniert. –
Ich benutze Delphi 7, und Writeln (Format (TMonitorInfoEx =% d TMonitorInfo =% d ', [Größe von (TMonitorInfoEx), sizeof (TMonitorInfo)])) Ausgaben: TMonitorInfoEx = 76 TMonitorInfo = 40 – unsynchronized