ハンドルを理解する

Microsoft Office 2000/Visual Basic プログラマーズ ガイド   

DLL の関数を呼び出す前に、その他の重要な概念である "ハンドル" について説明します。ハンドルは、32 ビットの正の整数であり、Windows では、ウィンドウ、またはフォントやビットマップなどのその他のオブジェクトの識別に使用されます。

Windows では、さまざまな形式のウィンドウが表示されます。実際、画面に表示されているかどうかにかかわらず、ほとんどの要素はウィンドウ内に存在します。最も一般的なアプリケーションのウィンドウなど、画面上で区切られた長方形の領域も 1 つのウィンドウ形式です。すべての種類のコントロールがウィンドウというわけではありませんが、リスト ボックス、スクロール バーなど、フォーム上にあるコントロールもウィンドウである場合があります。デスクトップに表示されるアイコン、およびデスクトップ自体もウィンドウです。

以上のオブジェクトはすべてウィンドウであるため、Windows ではいずれも同様に扱われます。Windows は、各ウィンドウに固有のハンドルを与え、そのハンドルを使用して該当するウィンドウを操作します。多くの API 関数はハンドルを返すか、引数として取得します。

Windows では、作成されたウィンドウにハンドルを割り当て、ウィンドウが削除されると、割り当てているハンドルを解放します。ウィンドウが存在する限りそのハンドルは保持されますが、ウィンドウを一度削除して再作成したときに同じハンドルが割り当てられるとは限りません。ハンドルを変数に保持する場合は、ウィンドウが削除されるとそのハンドルは無効になることに注意してください。

GetActiveWindow 関数は、ハンドルをウィンドウ (この場合は、アクティブなアプリケーション ウィンドウ) に返す関数の例です。GetWindowText 関数は、ハンドルをウィンドウに渡し、そのウィンドウにキャプションがある場合はそのキャプションを返します。次のプロシージャは、GetActiveWindow を使用してハンドルをアクティブ ウィンドウに返し、GetWindowText を使用してウィンドウのキャプションを返します。

  Declare Function GetActiveWindow Lib "user32" () As Long
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
   (ByVal Hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long

Function ActiveWindowCaption() As String
   Dim strCaption As String
   Dim lngLen   As Long
   
   ' Null 文字が含まれる文字列を作成します。
   strCaption = String$(255, vbNullChar)
   ' 文字列の長さを返します。
   lngLen = Len(strCaption)
   
   ' GetActiveWindow を呼び出してアクティブ ウィンドウにハンドルを返し、
   ' ハンドル、文字列、および長さを GetWindowText に渡します。
   If (GetWindowText(GetActiveWindow, strCaption, lngLen) > 0) Then
      Windows により文字列に書き込まれた値を返します。
      ActiveWindowCaption = strCaption
   End If
End Function

GetWindowText 関数では、ウィンドウのハンドル、ウィンドウのキャプションが返される Null 終端の文字列、および文字列の長さという 3 種類の引数を取得します。文字列を DLL 関数に渡す際の詳細については、この章の「DLL 関数から文字列を返す」を参照してください。

前の例の ActiveWindowCaption プロシージャは、Office 2000 Developer CD-ROM の ODETools\V9\Samples\OPG\Samples\CH10 サブフォルダに含まれる MiscAPIFunctions.xls の modActiveWindowCaption モジュールにあります。