DÜZENLEME - Bu Delphi 7.0 için inşa edilir sonunaHmonitor çözmek gerekiyor -> DeviceName (veya DeviceName -> Hmonitor) pencerelerinde
de Güncellemesi bakın 4,453
Özeti
Bir TMonitor nesnesinden bir TMonitor nesnesinden (TScreen bileşenindeki Monitors dizisindeki bir öğeden) Handle özelliğini alabilmem ve lpszDeviceName parametresi olarak EnumDisplaySettings çağrılarında kullanacağınız dizeye çevirmem gerekiyor.
(hedefim, çözümlenen lpszDeviceName değerini EnumDisplaySettings'e ileterek) verilen bir HMONITOR değerinden aygıt ayarlarının bir listesini almaktır.
detaylarını
Yukarıda sözü edildiği gibi, Screen.Monitors [x] .Handle özellik türü HMonitor arasında ve normal olarak GetMonitorInfo ile döner, geometri bilgi içine geçirmek için kullanılır, ancak hiçbir lpszDeviceName . (Not: szDevice alanı olan bir TMonitorInfoEx yapısı var, ancak cbSize alanını uygun boyuta ayarlamam olsa bile, sistemimde doldurulmuyor gibi görünüyor). i eşdeğer HMonitor değeri elde etmek için bir szDeviceName kullanabilir Alternatif
, bir karşılaştırma içinde kullanmak olan aşağıdaki fonksiyon takabilmek (I hMonitorFromDeviceName adı hayali işlev çağrısı ekledikten nasıl kullanılacağını göstermek için aşağıdaki kod). David Heffernan için
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;
Güncelleme
sayesinde, onun çözümünü test ettik ve burada verilen bir sap gelen monitör adını almak için örnek bir fonksiyonudur adres:
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;
Bunu sistemimde çalıştırdığımda, "parametre hatalı" özel durum olarak yükseltilir. – unsynchronized
Bu, cbSize yanlış olduğunda gerçekleşir. Hata ayıklayıcısının altında cbSize değerini görüyor musunuz? Ve Delphi'nin hangi versiyonuna sahipsiniz? Burada birşeyler var. Eminim bunun alt kısmına gidebiliriz ve API çağrısı sizin için işe yarayacaktır. –
delphi 7 kullanıyorum ve Writeln (Biçim ('TMonitorInfoEx =% d TMonitorInfo =% d', [Sizeof (TMonitorInfoEx), sizeof (TMonitorInfo)])) çıktılar: TMonitorInfoEx = 76 TMonitorInfo = 40 – unsynchronized