Win32_DesktopMonitor
WMI類將產生信息。
例如,使用從這裏取代碼:Delphi7: Get attached monitor properties
{$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;
while oEnum.Next(1, colItem, iValue) = 0 do
begin
Writeln('Caption ' + VarStrNull(colItem.Caption));
Writeln('Device ID ' + VarStrNull(colItem.DeviceID));
Writeln('Width ' + VarStrNull(colItem.ScreenWidth));
Writeln('Height ' + VarStrNull(colItem.ScreenHeight));
Writeln;
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.
如果出於任何原因WMI不可用,那麼你需要一個獨立的DPI感知過程中做的工作。這也將需要一些IPC。
另一個問題是最近的Windows版本已經改變了這些WMI類的行爲。您可能需要使用不同的WMI查詢。看到這裏:https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/138d387c-b222-4c9f-b3bb-c69ee890491c/problem-with-win32desktopmonitor-in-windows-8-platform?forum=windowsgeneraldevelopmentissues
這聽起來像一個美妙的解決方案。不幸的是,我對WMI的一些不好的經驗在某些電腦上不可用。我的程序在一些WMI函數之前使用。最後我不得不刪除它們。如果您在Google中搜索「WMI不可用」,則會看到很多報告。 – Ampere 2015-10-28 17:33:53
@ davidhefferman-我知道爲什麼我有這麼多與WMI相關的錯誤:WMI是一種服務,在某些系統上默認情況下不會啓用! https://www.youtube.com/watch?v=JgsHfc-4TUE – Ampere 2015-10-28 18:03:29
這不符合我的WMI體驗 – 2015-10-28 18:10:06