山本ワールド
Windowsプログラミング
アルゴリズム Vitual C++ 2008/2013によるWin32/Win64 APIレベルのプログラム 基礎 Vitual C++ 2008/2013によるAPIレベルのプログラム(32/64bit) Wix3でインストーラーを作る Visual C++ 2008 Standard Editonによるフォームアプリケーションのプログラム(32/64bit) Vitual C++ 2008 Standard EditonによるAPIレベルのプログラム(32/64bit) Windows 7対応 Visual C++ 2008 ExpressによるAPIレベルのプログラム Visual C++ 2005 ExpressによるAPIレベルのプログラム Visual C++ Versiosn 5 BORLAND C++ Windowsプログラム全般 Excel VBA その他WMIを使用してディスプレイサイズ,接続方法を取得
概要
WMI(Windows Management Instrumentation)を使用して接続されている全部のディスプレイサイズ,接続方法を取得してコマンドプロンプトに表示します。
以下に本プログラムを実行結果を記載します。
動作確認は、以下の環境で実施しました。
lenovo YogaPro3の内臓ディスプレイ(13.3インチ 3200*1800画素)とHDMI接続で TV JLCD32V-KW J-techno(32型 1920*1080画素 70.84㎝*39.85㎝)を使用したデュアルディスプレイ環境。
TVのサイズは以下の式で計算した。
lenovo YogaPro3については正常なサイズが取得できているが、TV(JLCD32V-KW J-techno)についてはサイズが160×90と取得されており値について意味が不明である。
外付けディスプレイについては正常に取得できている機種(BenQ XL2420T 24インチ 1920*1080画素 60㎝*34㎝)があるのでこのTVがイレギュラーと考えられる。
なお、WMIの名前空間とクラス名を調べるにはhttps://forest.watch.impress.co.jp/docs/review/702170.html SimpleWMIViewというフリーソフトが便利である。
以下に本プログラムを実行結果を記載します。
MaxHorizontalImageSize:29 MaxVerticalImageSize:17 VideoInputType:1 デジタル MaxHorizontalImageSize:160 MaxVerticalImageSize:90 VideoInputType:1 デジタル いずれかのキーを押すとプログラムを終了します。WMIはWindowsのシステム管理を行うためのインターフェースで主にスクリプトやプログラム言語でシステムイベント、システムの設定や状態の変更が可能である。 WMIは名前空間(このプログラムではroot¥¥WMIを指定)とクラス(このプログラムではWmiMonitorBasicDisplayParamsを指定)を指定して情報を取得する。
動作確認は、以下の環境で実施しました。
lenovo YogaPro3の内臓ディスプレイ(13.3インチ 3200*1800画素)とHDMI接続で TV JLCD32V-KW J-techno(32型 1920*1080画素 70.84㎝*39.85㎝)を使用したデュアルディスプレイ環境。
TVのサイズは以下の式で計算した。
lenovo YogaPro3については正常なサイズが取得できているが、TV(JLCD32V-KW J-techno)についてはサイズが160×90と取得されており値について意味が不明である。
外付けディスプレイについては正常に取得できている機種(BenQ XL2420T 24インチ 1920*1080画素 60㎝*34㎝)があるのでこのTVがイレギュラーと考えられる。
なお、WMIの名前空間とクラス名を調べるにはhttps://forest.watch.impress.co.jp/docs/review/702170.html SimpleWMIViewというフリーソフトが便利である。
コンパイル方法
Visual C++ 2008 Express Edition又はVisual C++ 2013 Expressで動作確認をしている。動作OSはWindows 32bit/64bit
プログラムソースの概要
WmiMonitorBasicDisplayParams.cpp
_tmain
WMIはCOM(Component Object Model)サーバーであり本プログラムはサーバに接続するクライアントとなる。CoInitializeExによりCOMライブラリを初期化します。WMIクライアントのスレッドはマルチスレッドで動作する必要があるのでCOINIT_MULTITHREADED DCOMはRPCを引数で指定しています。
DCOMは内部でRPC使用しておりRPCの通信はセキュリティ情報を設定する必要があるためCoInitializeSecurityによりセキュリティを設定します。
CoCreateInstanceによりWMIクライアント用のCOMオブジェクトを作成します。
IWbemServices::ConnectServerによりroot¥¥WMI名前空間に接続します。今回はローカルの名前空間なので第2,第3引数はNULLを指定しています。
DCOMは内部でRPC使用しておりRPCの通信はセキュリティ情報を設定する必要があるためCoSetProxyBlanketによりセキュリティを設定します。
IWbemServices::ExecQueryによりWMI(WWmiMonitorBasicDisplayParams)クラスを取得します。
IEnumWbemClassObject::NextによりIWbemClassObjectインスタンス取得します。
IWbemClassObject::GetによりMaxHorizontalImageSize,MaxVerticalImageSize,VideoInputTypeプロパティを検索します。
VT_UI1型が返されるのでサイズおよびディスプレイ接続形式を表示します。
VariantClearによりGet関数で作成されたintvalを解放します。
IWbemServices::Release,IWbemLocator::Release,EnumWbemClassObject::Releaseによりオブジェクトを解放します。
CoUninitializeによりCOMを解放します。
ソースコード
WmiMonitorBasicDisplayParams.cpp
// WMIを使用してroot¥WMI WmiMonitorBasicDisplayParamsの属性を表示(コマンドプロンプト)
// Visual C++ 2008/2013 UNICODE専用
// 動作例(ディスプレイサイズ(単位㎝)と入力形式を表示)
// MaxHorizontalImageSize:60
// MaxVerticalImageSize:34
// VideoInputType:1 デジタル
// いずれかのキーを押すとプログラムを終了します。
#define _WIN32_DCOM
#include <comdef.h>
#include <wbemidl.h>
#include <locale.h>
#include <tchar.h>
# pragma comment(lib, "wbemuuid.lib")
WCHAR* WMI_NAME_SPACE=L"root¥¥WMI";
int _tmain(int argc, TCHAR **argv){
// UNICODE文字を標準出力に正しく表示させるためにロケールを設定
_tsetlocale(LC_ALL, _TEXT(""));
HRESULT hres;
// COM の実行環境を作成
hres = CoInitializeEx(0, COINIT_MULTITHREADED);
if (FAILED(hres)){
_tprintf(_TEXT("CoInitializeEx Error¥n"));
return 1;
}
// COMのセキュリティの設定
hres = CoInitializeSecurity(NULL,-1,NULL,NULL,RPC_C_AUTHN_LEVEL_DEFAULT,
RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE,NULL);
if (FAILED(hres)){
_tprintf(_TEXT("CoInitializeSecurity Error¥n"));
CoUninitialize();
return 1;
}
// IWbemLocator インターフェースを取得(WMI クライアント)
IWbemLocator *pLoc = NULL;
hres = CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER,IID_IWbemLocator, (LPVOID *) &pLoc);
if (FAILED(hres)){
_tprintf(_TEXT("CoCreateInstance Error¥n"));
CoUninitialize();
return 1;
}
// 指定したnamespaceでWMIに接続
IWbemServices *pSvc = NULL;
hres = pLoc->ConnectServer(_bstr_t(WMI_NAME_SPACE), NULL, NULL, 0, NULL, 0, 0, &pSvc);
if (FAILED(hres)){
_tprintf(_TEXT("ConnectServer Error¥n"));
pLoc->Release();
CoUninitialize();
return 1;
}
// セキュリティの設定
hres = CoSetProxyBlanket(pSvc,RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE,NULL,RPC_C_AUTHN_LEVEL_CALL,
RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE);
if (FAILED(hres)){
_tprintf(_TEXT("CoSetProxyBlanket Error¥n"));
pSvc->Release();
pLoc->Release();
CoUninitialize();
return 1;
}
// WMIクラスの取得
IEnumWbemClassObject* pEnumerator = NULL;
hres = pSvc->ExecQuery( bstr_t("WQL"),bstr_t("Select * From WmiMonitorBasicDisplayParams"),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,NULL,&pEnumerator);
if (FAILED(hres)){
_tprintf(_TEXT("ExecQuery Error¥n"));
pSvc->Release();
pLoc->Release();
CoUninitialize();
return 1;
}
// プロパティを検索
IWbemClassObject *pclsObj = NULL;
ULONG uReturn = 0;
while (pEnumerator){
HRESULT hr = pEnumerator->Next(WBEM_INFINITE,1,&pclsObj, &uReturn);
if(0 == uReturn){
break;
}
VARIANT vtProp;
WCHAR* p;
hr = pclsObj->Get(p=L"MaxHorizontalImageSize", 0, &vtProp, 0, 0);
if(hr==S_OK){
UINT b=0xff;
if (vtProp.vt == VARENUM::VT_UI1)
b = vtProp.bVal;
_tprintf(_TEXT("%s:%d¥n"),p,b);
}
VariantClear(&vtProp);
hr = pclsObj->Get(p=L"MaxVerticalImageSize", 0, &vtProp, 0, 0);
if(hr==S_OK){
UINT b=0xff;
if (vtProp.vt == VARENUM::VT_UI1)
b = vtProp.bVal;
_tprintf(_TEXT("%s:%d¥n"),p,b);
}
VariantClear(&vtProp);
hr = pclsObj->Get(p=L"VideoInputType", 0, &vtProp, 0, 0);
if(hr==S_OK){
UINT b=0xff;
if (vtProp.vt == VARENUM::VT_UI1)
b = vtProp.bVal;
TCHAR* t=L"不明";
switch(b){
case 0:
t=L"アナログ";
break;
case 1:
t=L"デジタル";
break;
}
_tprintf(_TEXT("%s:%d %s¥n"),p,b,t);
}
VariantClear(&vtProp);
pclsObj->Release();
}
// メモリの解放
pSvc->Release();
pLoc->Release();
pEnumerator->Release();
CoUninitialize();
_tprintf(_TEXT("いずれかのキーを押すとプログラムを終了します。¥n"));
_gettchar();
return 0;
}
ソースファイルと実行ファイルのダウンロード
ダウンロード wmimonitorbasicdisplayparams.zip(62.1kByte)
ZIPファイルに含まれるファイルWmiMonitorBasicDisplayParams.cpp WmiMonitorBasicDisplayParams.exe
Copyright (C) 2012 山本ワールド All Rights Reserved.