2010-10-11 34 views
4

如何獲取我的顯示器屬性?我最感興趣的是製造商名稱和型號。我也不想從註冊表中獲取它。 (有些電腦像我的工作電腦限制訪問財產的鑰匙,所以我寧願要掃描一個系統總線或其他東西以外的東西。)Delphi7:獲取連接的顯示器屬性

任何想法? 感謝SoulBlade

+0

嗨。這個問題無論如何DPI有關? – Ampere 2014-09-29 15:40:14

回答

4

嘗試使用Win32_DesktopMonitor WMI類。這個課程有你正在尋找的所有信息。

檢查此示例代碼。

program GetWMI_MonitorInfo; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils, 
    ActiveX, 
    ComObj, 
    Variants; 

function VarStrNull(VarStr:OleVariant):string;//dummy function to handle null variants 
begin 
    Result:=''; 
    if not VarIsNull(VarStr) then 
    Result:=VarToStr(VarStr); 
end; 


procedure GetMonitorInfo; 
var 
    objWMIService : OLEVariant; 
    colItems  : OLEVariant; 
    colItem  : OLEVariant; 
    oEnum   : IEnumvariant; 
    iValue  : LongWord; 

    function GetWMIObject(const objectName: String): IDispatch; 
    var 
    chEaten: Integer; 
    BindCtx: IBindCtx; 
    Moniker: IMoniker; 
    begin 
    OleCheck(CreateBindCtx(0, bindCtx)); 
    OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten, Moniker)); 
    OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result)); 
    end; 

begin 
    objWMIService := GetWMIObject('winmgmts:\\localhost\root\CIMV2'); 
    colItems  := objWMIService.ExecQuery('SELECT * FROM Win32_DesktopMonitor','WQL',0); 
    oEnum   := IUnknown(colItems._NewEnum) as IEnumVariant; 
    if oEnum.Next(1, colItem, iValue) = 0 then 
    begin 
    Writeln('Caption  '+VarStrNull(colItem.Caption)); 
    Writeln('Description '+VarStrNull(colItem.Description)); 
    Writeln('Device ID '+VarStrNull(colItem.DeviceID)); 
    Writeln('Manufacturer '+VarStrNull(colItem.MonitorManufacturer));//Manufacter 
    Writeln('Type   '+VarStrNull(colItem.MonitorType));//Model 
    end; 

end; 


begin 
try 
    CoInitialize(nil); 
    try 
     GetMonitorInfo; 
     Readln; 
    finally 
    CoUninitialize; 
    end; 
except 
    on E:Exception do 
    Begin 
     Writeln(E.Classname, ': ', E.Message); 
     Readln; 
    End; 
    end; 
end.