Microsoft .NET へのアップグレード
Ken Getz
MCW Technologies
February 2002
日本語版最終更新日 2002 年 9 月 19 日
要約 : Microsoft .NET Framework の便利なクラスについて学ぶことにより、Win32 API 呼び出しを減らすことができます。ここで説明する各クラスは、Microsoft Visual Basic 6.0 で同じ目的のために行う必要があった 1 つまたは複数の Win32 API 呼び出しの代わりとなります。
目的
- 既存の Win32 API 呼び出しを具体的に何に切り替えるかを学ぶ
- Registry クラスについて学ぶ
- FileVersionInfo クラスで処理する
- 環境およびシステム情報を処理する
目次
Win32 API を使用しない
レジストリを処理する
コモン ダイアログ ボックスを使用する
ファイルのバージョン情報を取得する
環境情報を取得する
まとめ
Win32 API を使用しない
Microsoft® Visual Basic® 6.0 を使用する開発者であれば、必ず Win32® API を使用する機会があるでしょう。開発者が取り組むタスクによっては、Visual Basic で達成手段が提供されていないものが数多くあります。このようなタスクのいくつかの例を示します。
- ファイルのバージョン情報を特定する。
- レジストリの場所に対して読み取りおよび書き込みを行う。
- Microsoft Windows® のお気に入りや個人用フォルダなど、ユーザー専用フォルダを特定する。
- 使用可能なドライブの一覧を取得する。
- ユーザーのログイン名またはコンピュータ名を取得する。
- 開いているすべてのウィンドウの一覧を取得する。
Visual Basic 6.0 のツールを使用するだけでは、上記のタスクを達成することはできません。達成するためには、Windows API を使用する必要があります。実際、これまで多くの開発者は、Windows API を使用してこれらの (また、その他多数の) タスクをこなしてきました。
Windows API の問題点
では、なぜ .NET 環境では Windows API を使用しないのでしょうか。.NET Platform Invocation Service ("P/Invoke" と呼ばれます) を利用すれば、Windows API を使用することができます。Visual Basic 開発者にとっては、Windows API の呼び出しは、使い慣れた Declare ステートメントの使用と比較してもそれほど難しくありません。しかし、.NET での Windows API の使用には重大な欠点がいくつかあるため、可能な限り使用しない方が賢明です。次に、いくつかの欠点の例を示します。
- .NET 共通言語ランタイム は、プラットフォームに依存しない。Windows API 呼び出しを使用すると、コーディングと書き込みを行った特定のプラットフォーム (別のオペレーティング システムではなく Windows、およびそのバージョン) が関連付けられます。別のプラットフォームにコードを変換する必要が生じた場合、API 呼び出しを使用するコードの各行を修正しなければなけません。
- .NET からの Windows API (または DLL のアンマネージ コード) の呼び出しは、Visual Basic 6.0 からの呼び出しほど単純ではない。たとえば、構造体の機能の仕方に制限があるので、構造体を API 呼び出しに渡す過程が複雑になっています。さらに、データ型への変更とより厳密な型変換のため、Visual Basic 6.0 からの API 宣言を修正する必要があります。
- Windows API (および一般的な外部コード) を使用する技術は、言語によって異なる。複数の .NET 言語を使用する場合、各言語で必要な技術を習得する必要があります。
- Windows API を呼び出すコードを使用するには、ユーザーがそのコードの呼び出しに必要な権限を持っている必要がある。このため、アプリケーションのセキュリティに悪影響を与える可能性があります。また、事前に権限設定をしておく必要があります。
こうして見ると結論は明らかです。Visual Basic .NET アプリケーションからでも Windows API を使用することはできますが、可能な限り、.NET Framework で用意されている代替手段を使用するべきです。.NET Framework の主な目的は、Windows の機能を直接使用する必要をなくすことではありませんが、Framework では多数のクラスが用意されており、Windows API 呼び出しを使用しなくても済むようになっています。
Win32 API 呼び出しと、.NET Framework で同じタスクを実行する技術の完全な一覧があれば便利かもしれませんが、この記事では取り扱わないことにします。代わりに、この記事では、.NET Framework で用意されているいくつかの便利なクラスについて説明します。以下で説明する各クラスは、Visual Basic 6.0 で同じ目的に使用されていた 1 つまたは複数の Win32 API 呼び出しの代わりとなります。
レジストリを処理する
多くの Visual Basic 6.0 開発者にとって、Microsoft Visual Basic for Applications (VBA) に組み込まれている SaveSetting、GetSetting、GetAllSettings、および DeleteSetting メソッドは、どちらかと言えば便利な機能と言えます。しかし、これらのメソッドは、HKEY_CURRENT_USER\Software\VB にあるキーおよびレジストリ内の VBA Program Settings キーがなければ機能しないため、この制限に対する開発者の不満は大きいはずです。レジストリ内の別の場所でキーや値の読み取りまたは書き込みを行うには、複雑な API 呼び出しを行うか、それらの詳細を処理した他の開発者のコードを使用する必要があります。
.NET Framework では、レジストリの処理を簡単にする強力なクラスのペア (Registry および RegistryKey) が Microsoft.Win32 名前空間に用意されています。これを使用することにより、API 呼び出しは必要なくなります。
サンプル オブジェクトのメイン フォームの [Work with the Registry] ボタンをクリックしてみてください。このフォームは、SOFTWARE\Microsoft\Windows\ CurrentVersion\Run キーの HKEY_LOCAL_MACHINE ハイブにあるすべての値の一覧を表示します。図 1 で示すように、一覧のどの項目でも右クリックして、新しい項目の挿入や、選択した項目の編集および削除を行うことができます。
ヒント : このサンプル フォームは、リスト ボックスで Enter キーを押すと、現在選択されている項目を編集できるように設計されています。Del キーを押すと項目を削除し、Ins キーを押すと新しい値を追加します。これらの項目は、リスト ボックスのコンテキスト メニューに対応しています。
図 1. Windows レジストリでの情報は、Registry および RegistryKey クラスを使用して、簡単に取得および修正できる
.NET Framework は 2 つの便利なクラスを備えており、Windows レジストリでの処理を簡単に行うことができます。1 つ目の Registry には、標準 Registry ハイブのそれぞれに対応するフィールドがあります。
- ClassesRoot (HKEY_CLASSES_ROOT)
- CurrentConfig (HKEY_CURRENT_CONFIG)
- CurrentUser (HKEY_CURRENT_USER)
- DynData (HKEY_DYN_DATA)
- LocalMachine (HKEY_LOCAL_MACHINE)
- PerformanceData (HKEY_PERFORMANCE_DATA)
- Users (HKEY_USERS)
Registry クラスを使用するには、必要なハイブへの参照を取得します。サンプル フォームの LoadList プロシージャには、次のようなコードが含まれており、レジストリの HKEY_LOCAL_MACHINE ハイブを処理します。
Imports Microsoft.Win32
Dim reg As RegistryKey = Registry.LocalMachine
一方、RegistryKey クラスは、すべての作業を担当します。レジストリを処理するメソッドのグループが提供されています。表 1 は、RegistryKey クラスのすべての便利なメソッドを示します。
表 1. RegistryKey クラスのメソッド
|
メソッド
|
説明
|
| CreateSubKey | 新しいサブキーを作成するか、既存のサブキーを開きます。 |
| DeleteSubKey | 指定したサブキーを削除します。 |
| DeleteSubKeyTree | サブキーとその子サブキーを再帰的に削除します。 |
| DeleteValue | 指定した値をこのキーから削除します。 |
| GetSubKeyNames | すべてのサブキー名を含む文字列の配列を取得します。 |
| GetValue | 指定した値を取得します。 |
| GetValueNames | このキーに関連するすべての値の名前を含む文字列の配列を取得します。 |
| OpenSubKey | 指定したサブキーを取得します (任意で書き込みアクセス)。 |
| SetValue | 指定した値を設定します。 |
RegistryKey クラスには、次の 3 つのプロパティもあります。
- Name : キーの名前を取得します。
- SubkeyCount : キーに関連するサブキーの数を取得します。
- ValueCount : キーに関連する値の数を取得します。
サンプル フォームの ListLoad プロシージャは、指定されたキーから値をすべて取得し、それらをフォームのリスト ボックスに追加します。
Private Const conRegKey As String = _
"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
Private Structure RegData
Public Value As String
Public Data As String
Public Overrides _
Function ToString() As String
Return Me.Value
End Function
End Structure
Private Sub ListLoad()
Dim reg As RegistryKey = Registry.LocalMachine
Dim astrValues() As String
Dim strValue As String
Dim rd As RegData
' リスト ボックスから既存の項目をクリアします。
lstItems.BeginUpdate()
lstItems.Items.Clear()
' レジストリ キーを開き、キーの値で
' リスト ボックスを読み込みます。
reg = reg.OpenSubKey(conRegKey)
astrValues = reg.GetValueNames()
For Each strValue In astrValues
rd.Value = strValue.ToString
rd.Data = reg.GetValue(strValue)
lstItems.Items.Add(rd)
Next
lstItems.EndUpdate()
End Sub
サンプル フォームで編集または新しい値の追加を選択すると、次のコードが実行されます。
Private Sub AddOrEdit( _
ByVal rd As RegData, _
ByVal Mode As frmAddValue.AccessMode)
Dim reg As RegistryKey = Registry.LocalMachine
Dim frm As New frmAddValue(Mode)
frm.KeyName = rd.Value
frm.KeyData = rd.Data
If frm.ShowDialog() = DialogResult.OK Then
If frm.KeyName <> String.Empty Then
reg = reg.OpenSubKey(conRegKey, True)
reg.SetValue(frm.KeyName, frm.KeyData)
ListLoad()
End If
End If
End Sub
このコードでは、再度レジストリ キーを開きます。ここでは、キーへの書き込み許可を要求します (OpenSubKey の 2 つ目のパラメータにより、この要求が行われます)。次に、SetValue メソッドが呼び出され、図 1 に示すように、ダイアログ ボックス フォームからキー名と値が渡されます。SetValue メソッドを使って、新しい値を追加することも、既存の値を修正することもできます。値がない場合は、SetValue メソッドによって値が追加されます。
値を削除するには、サンプル フォームで次のコードを呼び出します。
Private Sub DeleteKey(ByVal rd As RegData)
Dim strText As String
Dim reg As RegistryKey = Registry.LocalMachine
If lstItems.SelectedIndex = -1 Then
Exit Sub
End If
' 選択したキーを削除します。
strText = String.Format( _
"Are you sure you want to delete ""{0}""?", _
rd.Value)
If MessageBox.Show(strText, _
"Delete Registry Value", _
MessageBoxButtons.YesNo, _
MessageBoxIcon.Question) = DialogResult.Yes Then
' キーを開き、書き込みを許可します。
reg = reg.OpenSubKey(conRegKey, True)
reg.DeleteValue(rd.Value)
' リスト ボックスを再度読み込みます。
ListLoad()
End If
End Sub
このコードでは、キーへの書き込み権限を要求してキーを開き、次に DeleteValue メソッドを呼び出して選択した値を削除します。
サンプル フォームで得られた情報と .NET Framework のドキュメントに記載されている情報により、Windows API を使用せずに、レジストリ関連のタスクを実行できます。これは単純なオブジェクト モデルであり、Visual Basic 6.0 よりも強力な開発機能を提供します。
ヒント : 必要な権限があれば、リモート コンピュータでレジストリを処理することもできます。自分のコンピュータの Registry ハイブを示す Registry クラスのプロパティを使用せずに、RegistryKey.OpenRemoteBaseKey メソッドを呼び出して、別のコンピュータの基本キーを取得します。
コモン ダイアログ ボックスを使用する
Windows ではコモン ダイアログ ボックスのグループが用意されているので、開発者はユーザーの情報を簡単に要求できます。皆さんも [ファイルを開く]、[名前を付けて保存]、[色]、[印刷]、[フォント] などのコモン ダイアログ ボックスを見たり、使用したことがあるでしょう。これらのダイアログ ボックスを使用する方法として、Visual Basic 6.0 開発者には 2 つの選択肢があります。次のいずれかの方法です。
- コモン ダイアログ ボックスをラップする単純なオブジェクト モデルを提供する Microsoft ActiveX® コントロールを使用する。しかし、このコントロールには、コントロールのバージョンや基礎 DLL によって、配置に関する深刻な問題があります (この問題こそ、多くの Visual Basic 6.0 開発者にとって最大の問題になっています)。
- Windows API を直接使用して、メッセージを送信し、コールバック機能によってさまざまなコモン ダイアログ ボックスを管理する。
どちらの方法も完璧ではなく、また .NET Framework での新しい機能により、どちらも不要になりました。System.Windows.Forms 名前空間には、ColorDialog、FileDialog、FontDialog、および PrintDialog クラスがあります。これらのクラスはフレームワークに組み込まれているので、API 呼び出しも ActiveX® コントロールも必要ありません。また、この標準機能をアプリケーションに簡単に組み込むことができます。
これらのクラスにはそれぞれ一連のプロパティがあり、クラスの ShowDialog メソッドを使用してダイアログ ボックスを表示する前に、設定することができます。この記事では、各クラスの詳細については説明しませんが、サンプル プロジェクトでは FileDialog クラスを使用しており、ファイルの選択が可能になっています。メイン フォームの [File Version Info] ボタンをクリックすると、デモ フォームの [Select a File] ボタンを使用して [開く] ダイアログ ボックス (図 2) を表示できます。
図 2. FileDialog クラスを使用して Windows のコモン ダイアログ ボックスを表示する
FileDialog クラスには、Windows API を直接プログラミングする場合ほどの柔軟性はありませんが、ダイアログ ボックスの動作を制御できるプロパティが数多くあります。ファイルの検索場所を特定し、1 つまたは複数のファイルを選択して、選択したファイルの名前を取得することができます。表 2 は、FileDialog クラスの使用頻度の高いプロパティとメソッドのサブセットの一覧です。
表 2. FileDialog オブジェクトのプロパティとメソッド
|
プロパティ/メソッド
|
説明
|
| AddExtension | ユーザーが拡張子を入力しなかった場合に、ダイアログ ボックスが自動的に拡張子を追加するかどうかを示します。 |
| CheckFileExists | ユーザーが存在しないファイル名を指定した場合に、警告を表示するかどうかを示します。 |
| CheckPathExists | ユーザーが存在しないパスを指定した場合に、警告を表示するかどうかを示します。 |
| DefaultExt | 既定のファイル拡張子です。 |
| DereferenceLinks | ダイアログ ボックスが、ショートカットが参照するファイルの場所を返すかどうか、またはショートカット (.lnk) の場所を返すかどうかを示します。 |
| FileName | ダイアログ ボックスで選択したファイル名です。 |
| FileNames | (読み取り専用) ダイアログ ボックスで選択したすべてのファイルのファイル名です。 |
| Filter | 現在のファイル名のフィルタ文字列です。ダイアログ ボックスの [ファイルの種類] ボックスに表示される選択肢を指定します。 |
| FilterIndex | ファイル ダイアログ ボックスで現在選択されているフィルタのインデックスです。 |
| InitialDirectory | ファイル ダイアログ ボックスで表示される初期ディレクトリです。 |
| RestoreDirectory | ダイアログ ボックスが閉じる前に、現在のディレクトリを元に戻すかどうかを示します。 |
| ShowHelp | ダイアログ ボックスで [ヘルプ] ボタンを表示するかどうかを示します。 |
| Title | ダイアログ ボックスのタイトルです。 |
| ValidateNames | ダイアログ ボックスが有効なファイル名だけを受け取るかどうかを示します。 |
| Reset (メソッド) | すべてのプロパティを既定値にリセットします。 |
| ShowDialog (メソッド) | ファイル ダイアログ ボックスを表示します。ユーザーが [OK] をクリックすると DialogResult.OK を返し、そうでない場合は DialogResult.Cancel を返します。 |
[Select a File] をクリックすると、frmFileVersionInfo サンプル フォームは次のコードを呼び出します。
Private Sub btnSelectFile_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles btnSelectFile.Click
Dim ofd As OpenFileDialog = New OpenFileDialog()
ofd.Filter = _
"Executable files (*.exe;*.dll;*.ocx)|" & _
"*.exe;*.dll;*.ocx|" & _
"Drivers (*.sys;*.drv;*.fnt)|" & _
"*.sys;*.drv;*.fnt|" & _
"All files (*.*)|*.*"
ofd.FilterIndex = 1
ofd.ShowReadOnly = False
ofd.RestoreDirectory = True
If ofd.ShowDialog() = DialogResult.OK Then
If ofd.FileName.Length > 0 Then
' ファイルのバージョン情報を表示します。
DisplayFileInfo(ofd.FileName)
End If
End If
End Sub
ヒント : Visual Basic 6.0 の CommonDialog ActiveX コントロールを使用する場合と同様、FileDialog クラスの Filter プロパティを、"Description|FileSpec" のように、値のペアを縦線 (|) で区切った文字列に設定します。
この例では、ファイル名を選択すると、サンプル フォームにより ListView コントロールのファイルに関する情報が表示されます。次のセクションでは、これを可能にしている FileVersionInfo クラスについて説明します。
ファイルのバージョン情報を取得する
開発者およびコンパイル担当者は、バージョン情報を実行可能ファイル、DLL ファイル、およびドライバ ファイルに組み込むことができます。この情報の一部またはすべてをアプリケーションの一部として取得することが必要な場合がありますが、Visual Basic 6.0 でこれを行うには多数の API 呼び出しが必要でした。GetVersionInfoSize、VerQueryValue、および GetFileVersionInfo Win32 API 関数を呼び出す必要がありますが、Visual Basic ではどれも簡単な作業ではありません。
しかし、.NET Framework の FileVersionInfo オブジェクトを使用すると、この作業が驚くほど簡単になります。FileVersionInfo オブジェクトの共有 GetVersionInfo メソッドを呼び出し、ファイル名を渡すだけです。サンプル フォームでは以下のようなコードを使用します。
Dim fvi As FileVersionInfo = _
FileVersionInfo.GetVersionInfo(strFile)
その後は、FileVersionInfo オブジェクトのプロパティを取得するだけです。サンプル フォームは、以下で示すように、フォームの ListView コントロールに各プロパティ名と値を追加する、小さなプロシージャを使用します。
Private Sub AddItem( _
ByVal strProperty As String, _
ByVal strValue As String)
With lvwInfo.Items.Add(strProperty)
.SubItems.Add(strValue)
End With
End Sub
次に実際の作業を行うコードが、プロパティごとに 1 回ずつ、AddItem を繰り返して呼び出します。
AddItem("Comments", fvi.Comments)
AddItem("CompanyName", fvi.CompanyName)
AddItem("Language", fvi.Language)
' ここで行が削除されます...
AddItem("Product", fvi.ProductName)
AddItem("ProductPrivatePart", _
fvi.ProductPrivatePart.ToString())
AddItem("ProductVersion", fvi.ProductVersion)
AddItem("SpecialBuild", fvi.SpecialBuild)
図 3 で示すように、プログラム的に使用できるすべてのバージョン情報が結果のフォームに表示されます。
図 3. FileVersionInfo クラスを使用してファイルのバージョン情報を取得する
環境情報を取得する
Win32 API には、ユーザーの環境設定を指定するための関数が多数あります。たとえば、GetSystemMetrics および SystemParametersInfo です。これらの API 関数を .NET アプリケーションから呼び出すこともできますが、その必要はほとんどありません。(System 名前空間の) Environment クラスおよび (System.Windows.Forms 名前空間の) SystemInformation クラスによって、API 関数が提供する情報とほとんど同じ情報が提供されます。このセクションでは、これら 2 つのクラスの機能を例を使って示します。
警告 : これらのクラスからユーザーの環境設定を変更することはできません。表示される情報はすべて読み取り専用です。環境を修正するには別の手段が必要です。
System.Environment クラスを使用する
System.Environment クラスでは、異なるいくつかの情報を提供します。同じことを Windows API 呼び出しで行うには、複数の呼び出しが必要です。System.Environment を使用すると、以下の情報を取得することができます。
- 利用可能なドライブに関する情報 (GetLogicalDrives メソッド)
- Windows を起動してから経過したミリ秒単位の時間 (TickCount プロパティ)
- 一般的な環境設定 (CurrentDirectory、MachineName、OSVersion、SystemDirectory、UserDomainName、UserInteractive、UserName、および WorkingSet プロパティ)
- 特殊フォルダの一覧 (GetFolderPath メソッド)
Windows API で作業した経験があれば、これらのメソッドとプロパティによって、GetTickCount、GetLogicalDrives、GetSystemDirectory、GetComputerName、GetUserName、GetVersionEx などの多くの API 呼び出しが置き換えられることがわかります。
図 4 で示されているサンプル フォーム (メイン フォームの [Environment Info] をクリックします) は、GetLogicalDrives メソッドの結果を上部のリスト ボックスに表示します。これには、すべての特殊フォルダの一覧 (GetFolderPath メソッドを使用して取得します) が含まれます。また、フォーム下部のリスト ボックスには、クラスの多くのプロパティの結果が表示されます。
図 4. System.Environment クラスによって使用されるプロパティとメソッドを示すフォーム
さらに、TickCount プロパティをテストするには、[Test ClickCount] をクリックし、サンプル フォームで定義された StopWatch クラスの処理結果を表示して、以下のコードを使用します。
Public Class StopWatch
Private mintStart As Integer
Public Sub Start()
mintStart = Environment.TickCount
End Sub
Public Function Elapsed() As Integer
Return Environment.TickCount - mintStart
End Function
Public Overrides Function ToString() As String
Return String.Format( _
"Started: {0}, Elapsed: {1}", _
mintStart, Me.Elapsed)
End Function
End Class
次に示す FillProperties メソッドは、前述の AddItem メソッドのコピーを使用して ListView コントロールにプロパティ名と結果を挿入します。
Private Sub FillProperties()
AddItem("CurrentDirectory", _
Environment.CurrentDirectory)
AddItem("MachineName", Environment.MachineName)
AddItem("OSVersion.Platform", _
Environment.OSVersion.Platform.ToString)
AddItem("OSVersion.Version", _
Environment.OSVersion.Version.ToString)
AddItem("SystemDirectory", _
Environment.SystemDirectory)
AddItem("UserDomainName", Environment.UserDomainName)
AddItem("UserInteractive", _
Environment.UserInteractive)
AddItem("UserName", Environment.UserName)
AddItem("WorkingSet", Environment.WorkingSet)
End Sub
FillFolderList メソッドは、Environment クラスを使用するだけでなく、他にも便利なコードを含んでいます。このプロシージャでは、Environment クラスによって提供される SpecialFolder 列挙のメンバをループすることを目的としています (この列挙には、お気に入りや履歴など、物理的フォルダの論理名が含まれます)。プロシージャにより、各列挙値の名前がフォームの ListView コントロールに追加されます。また、Environment オブジェクトの GetFolderPath メソッドに列挙値を渡した結果も追加されます。次に示すプロシージャによりすべて処理されます。
Private Sub FillFolderList()
Dim strName As String
Dim astrNames() As String
Dim aintValues As Array
Dim i As Integer
' ListView コントロールの最初の列に
' SpecialFolder 列挙の名前を挿入します。
astrNames = System.Enum.GetNames( _
GetType(Environment.SpecialFolder))
aintValues = System.Enum.GetValues( _
GetType(Environment.SpecialFolder))
For i = 0 To astrNames.Length - 1
With lvwFolders.Items.Add(astrNames(i))
.SubItems.Add( _
Environment.GetFolderPath(aintValues(i)))
End With
Next
End Sub
この例では、Environment オブジェクトに送られたパラメータをハード コーディングするのではなく、Enum クラスの共有 GetNames メソッドおよび GetValues メソッドを使用します。Visual Basic .NET GetType 関数を呼び出した結果を GetNames に渡すことにより (特定の列挙型を渡すことにより)、列挙のすべてのメンバの名前が入った配列を取得します。GetValues メソッドで処理を繰り返すと、列挙の値をすべて含む Array オブジェクトを返します。
astrNames = System.Enum.GetNames( _
GetType(Environment.SpecialFolder))
aintValues = System.Enum.GetValues( _
GetType(Environment.SpecialFolder))
この 2 つの配列により、プロシージャの残りは両方をループし、astrNames の値を ListView に追加してから Environment クラスの GetFolderPath メソッドを呼び出して、対応するパスを取得します。
For i = 0 To astrNames.Length - 1
With lvwFolders.Items.Add(astrNames(i))
.SubItems.Add( _
Environment.GetFolderPath(aintValues(i)))
End With
Next
図 4 の上部に示されている ListView コントロールには、このコードの出力が含まれます。
ヒント : Enum クラスは、この例で示した GetNames や GetValues メソッドなどのように、Visual Basic 6.0 では使用できない技術を提供します。Enum クラスの機能の詳細については、.NET Framework のドキュメントを参照してください。
Windows.Forms.SystemInformation クラスを使用する
通常、ユーザー インターフェイスをていねいに作成するには、アイコンの幅や高さ、スクロールバーの幅など、現在の Windows の設定を特定する必要があります。Visual Basic 6.0 では、GetSystemMetrics や SystemParametersInfo Windows API 関数を使用して、このような種類の設定を特定します。一方 .NET Framework では、Windows.Forms 名前空間で提供される SystemInformation クラスを使用することができます。
図 5 で示すように、frmSystemInformation で使用されるコードはあまり興味深いものではありませんが、クラスによって提供されるプロパティをすべて確認することができます (メイン フォームの [SystemInformation Info] をクリックして、このサンプル フォームをテストします)。サンプル フォームは、SystemInformation クラスのすべてのプロパティを確認し、フォームの ListView コントロールに各プロパティの名前と現在の値を表示します。
図 5. Windows.Forms.SystemInformation クラスのすべてのプロパティを表示するサンプル フォーム
サンプル フォームは前述の AddItem メソッドを使用し、SystemInformation クラスの約 60 個あるプロパティをループして、結果を表示します。
AddItem("ArrangeDirection", _
SystemInformation.ArrangeDirection)
AddItem("StartingPosition", _
SystemInformation.ArrangeStartingPosition)
AddItem("BootMode", SystemInformation.BootMode)
' など...
まとめ
- Visual Basic .NET では、Platform Invocation Services (P/Invoke) を使用し、アンマネージ コードを処理して Windows API を直接呼び出すこともできるが、Visual Basic .NET アプリケーションを作成する際には別の方法を使用したほうがよいです。Declare ステートメントにより詳細が処理されるので、P/Invoke について詳しく理解する必要はありません。
- .NET Framework は、すべての Windows API 機能を含んでいるわけではありませんが、Visual Basic 6.0 で API 呼び出しを使用して行っていたほとんどのことは、Framework でも実行できます。
- Registry および RegistryKey クラスを使用して、Windows レジストリを簡単に処理できるため、多くの API 呼び出しを行わないで済みます。
- FileDialog、ColorDialog、FontDialog、および PrinterDialog クラスを使用して、Windows のコモン ダイアログ ボックスを簡単に処理できます。Windows API を直接呼び出したり、複雑な CommonDialog ActiveX コントロールを使用する必要はありません。
- FileVersionInfo クラスを使用して、実行可能ファイル、ドライバ、および DLL ファイルに組み込まれたファイルのバージョン情報を取得できます。このクラスにより、Visual Basic 6.0 で必要な、煩雑な Windows API コーディングのいくつかが不要になります。
- Environment および SystemInformation クラスを使用して、Visual Basic 6.0 では複数の異なる API 関数を呼び出す必要があるシステム設定の取得を簡単に行うことができます。
著者紹介
Ken Getz は、MCW Technologies のシニア コンサルタントであり、プログラミング、著述、および後進の指導で活動しています。Microsoft Access、Visual Basic、その他の Office および BackOffice Suite で作成されたツールとアプリケーションを専門としています。複数の共著があります。たとえば、Paul Litwin、Mike Gilbert との共著 『Access 97 Developer's Handbook』 および 『Access 2000 Developer's Handbooks』、Paul Litwin、Mike Gunderloy との共著 『Access 2002 Developer's Handbooks』、Mike Gilbert との共著 『Visual Basic Language Developer's Handbook』 および 『VBA Developer's Handbook』 (Sybex) があります。また、AppDev で教材を共同制作し、指導にもあたっています。テクノロジに関するさまざまなコンフェレンスでも頻繁に講演しており、1994 年から Microsoft Tech*Ed にスピーカーとして参加しています。『Access/VB/SQL Advisor』 誌のテクニカル エディタ、Informant Communication Group の 『Microsoft Office Solutions』 誌の寄稿エディタとしても活動しています。
Informant Communications Group について
Informant Communications Group, Inc (www.informant.com) は、多角的なメディア企業であり、情報技術部門に特に力を注いでいます。1990 年に創設され、ソフトウェア開発に関する書籍の発行、会議の主催、カタログの発行、および Web サイトの運営を行っています。米国と英国に事務所を構え、メディアおよびマーケティングのコンテンツ インテグレータとして高い評価を受けており、質の高い技術情報を必要とする IT スペシャリストに有用な情報を提供しています。