2013-04-01 8 views
5

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; 

cevap

5

bence GetMonitorInfo numaralı telefonu yanlış aramanız gerekiyor. Bu kod:

{$APPTYPE CONSOLE} 

uses 
    SysUtils, MultiMon, Windows, Forms; 

var 
    i: Integer; 
    MonitorInfo: TMonitorInfoEx; 
begin 
    MonitorInfo.cbSize := SizeOf(MonitorInfo); 
    for i := 0 to Screen.MonitorCount-1 do 
    begin 
    if not GetMonitorInfo(Screen.Monitors[i].Handle, @MonitorInfo) then 
     RaiseLastOSError; 
    Writeln(MonitorInfo.szDevice); 
    end; 
    Readln; 
end. 

benim makinede bu çıktıyı üretir:

 
\\.\DISPLAY1 
\\.\DISPLAY2 

Ben GetMonitorInfo için çağrı bir şekilde başarısız oluyor ve belki de hatalar için dönüş değeri denetimi olmadığını sanıyorum. QC#3239:


Sana Delphi eski sürümlerinde bilinen bir hatadan kurbanı olmuştur şüpheli QualityCentral arandı. Bu, Delphi 2006 olan 10.0.2124.6661 sürümünde bildirilmiştir.

Yorumlariniz bu teşhisi onaylıyor. Sorunu çözmek için yeni bir TMonitorInfoEx tanımına ihtiyacınız olacak.İşte öncesi Unicode Delphi üzerinde çalışacak bir tane:

type 
    TMonitorInfoEx = record 
    cbSize: DWORD; 
    rcMonitor: TRect; 
    rcWork: TRect; 
    dwFlags: DWORD; 
    szDevice: array[0..CCHDEVICENAME - 1] of AnsiChar; 
    end; 

Eğer (tabii değişkenleri bildirmek önce) Yukarıdaki koda sonra onu sorununuzu çözecektir inanıyoruz ekleyin. Hatta XE3 içinde, bir kenara ilginç olarak


, bu yapılar doğru tercüme edilmemiştir: QC#114460. Kuşkusuz bu hata, sadece PMonitorInfoExA ve TMonitorInfoExA'u etkilediği için oldukça iyi huylu, ancak bu sorudaki problemi çözmeye çalışırken hata beni yakaladı!

+0

Bunu sistemimde çalıştırdığımda, "parametre hatalı" özel durum olarak yükseltilir. – unsynchronized

+0

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. –

+0

delphi 7 kullanıyorum ve Writeln (Biçim ('TMonitorInfoEx =% d TMonitorInfo =% d', [Sizeof (TMonitorInfoEx), sizeof (TMonitorInfo)])) çıktılar: TMonitorInfoEx = 76 TMonitorInfo = 40 – unsynchronized

İlgili konular