C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: ディスプレイのインチサイズを取得する方法


(過去ログ 141 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■82691 / inTopicNo.1)  ディスプレイのインチサイズを取得する方法
  
□投稿者/ ガンマ (1回)-(2017/01/27(Fri) 11:37:19)

分類:[.NET 全般] 




VB.NETです、

画面の解像度を取得する方法は調べてすぐに分かったのですが
ディスプレイのインチサイズを取得できる方法があれば教えてください





引用返信 編集キー/
■82693 / inTopicNo.2)  Re[1]: ディスプレイのインチサイズを取得する方法
□投稿者/ 魔界の仮面弁士 (1089回)-(2017/01/27(Fri) 12:38:50)
2017/01/27(Fri) 12:43:33 編集(投稿者)

No82691 (ガンマ さん) に返信
> 画面の解像度を取得する方法は調べてすぐに分かったのですが
> ディスプレイのインチサイズを取得できる方法があれば教えてください

物理サイズではなく論理サイズになりますが、WmiMonitorBasicDisplayParams クラスを使うと
センチメートル換算の整数値を拾えます。

横方向の長さは MaxHorizontalImageSize プロパティ、
縦方向の長さは MaxVerticalImageSize プロパティです。
https://msdn.microsoft.com/en-us/library/aa394535.aspx


「ディスプレイのインチサイズ」は、対角線の長さですから
上記を三平方の定理に当てはめれば求まります。すなわち、

 Return Math.Sqrt(横 ^ 2 + 縦 ^ 2) / 2.54

という計算式になります。(1 インチ = 2.54 センチメートル)
たとえば横 38 cm、縦 30 cm なら、19 インチモニタと算出されますね。



なお、計算する際にはデータ型の取り扱いにもご注意下さい。

WmiMonitorBasicDisplayParams から得られる値は Byte 型ですので、
上記の「横 ^ 2」という式を「横 * 横」に置き換えるとオーバーフローします。
Integer 型の変数に受けてからなら、「横 * 横」でも大丈夫ですけれどね。

ちなみに「Math.Sqrt」や「Math.Pow(あるいは ^ 演算子)」は Double 型の演算処理です。


--- 追記 ---

MaxHorizontalImageSize や MaxVerticalImageSize は、
未確定サイズの環境では 0 を返す可能性があります。
(たとえば、投影型のプロジェクター出力時など)
引用返信 編集キー/
■82779 / inTopicNo.3)  Re[2]: ディスプレイのインチサイズを取得する方法
□投稿者/ ガンマ (3回)-(2017/02/03(Fri) 18:04:54)
ありがとうございます。


VB用に翻訳してみたところ以下のようになりました

Class WmiMonitorBasicDisplayParams
Inherits MSMonitorClass
Private Active As [Boolean]
Private DisplayTransferCharacteristic As uint8
Private InstanceName As String
Private MaxHorizontalImageSize As uint8
Private MaxVerticalImageSize As uint8
Private SupportedDisplayFeatures As SupportedDisplayFeaturesDescriptor
Private VideoInputType As uint8
End Class


MSMonitorClassやuint8などでエラーが出てビルドすることができません。

VB WmiMonitorBasicDisplayParams
で検索をかけてみたところ以下のページが見つかりました

http://wutils.com/wmi/root/wmi/wmimonitorbasicdisplayparams/vb-net-samples.html

しかし、まったく使い方が分かりませんでした

一体どのように使えば良いかお教え願えないでしょうか?






引用返信 編集キー/
■82780 / inTopicNo.4)  Re[3]: ディスプレイのインチサイズを取得する方法
□投稿者/ 魔界の仮面弁士 (1109回)-(2017/02/03(Fri) 20:09:03)
No82779 (ガンマ さん) に返信
> VB用に翻訳してみたところ以下のようになりました

……WMI の利用は初めてでしょうか?


WMI の利用経験が無いのであれば、まずはコーディング前に、
求める値が得られるのかどうか、まずは PowerShell で試してみることをお奨めします。


PowerShell のコンソールを起動し、
『Get-WmiObject -Namespace root\wmi -Class WmiMonitorBasicDisplayParams』
というコマンドを実行してみてください。モニタ情報が表示されるはずです。



> MSMonitorClassやuint8などでエラーが出てビルドすることができません。

WMI のクラスは、自分で宣言するのではなく、
参照設定に『System.Management』を加えた上で、
System.Management名前空間のクラス群を通じて利用するものです。

あるいは、「MgmtClassGen」でラッパークラスを作って利用するか。


たとえば後者の場合は、Visual Studio コマンドプロンプトから
『MgmtclassGen Win32_Logicaldisk /L VB /N root\cimv2』
のコマンドを実行することで、ラッパークラスが生成され、
下記のように取得できます。

 Dim monitorSize() As Double = ( _
   From mo In ROOT.WMI.WmiMonitorBasicDisplayParams.GetInstances() _
    .OfType(Of ROOT.WMI.WmiMonitorBasicDisplayParams)() _
   Let h = CDbl(mo.MaxHorizontalImageSize), v = CDbl(mo.MaxVerticalImageSize) _
    Select Math.Sqrt(h * h + v * v) / 2.54 _
 ).ToArray()


一方前者は、提示頂いたサイトで使われていた方法ですね。
あらかじめ、System.Management 名前空間を Imports しておいてください。

 Dim monitorSize() As Double
 Dim p = "Root\wmi:WmiMonitorBasicDisplayParams"
 Using m As New ManagementClass(p), monitors = m.GetInstances()
  Dim q = From mo In monitors.OfType(Of ManagementBaseObject)()
    Let h = CDbl(mo("MaxHorizontalImageSize")),
    v = CDbl(mo("MaxVerticalImageSize"))
    Select Math.Sqrt(h * h + v * v) / 2.54
  monitorSize = q.ToArray()
 End Using


※マルチモニタ環境の場合があるため、列挙された一覧は配列に入れています。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -