本ページは公開が終了した情報の複製であり、掲載時点での情報です。本ページに記載されている内容について各所に問い合わせることはご遠慮下さい。
サポート技術情報

[VB] ウィンドウのクラス名や属性を取得する方法

文書番号: 112649

最終更新日: 2003/08/01


この資料は以下の製品について記述したものです。


この記事は、以前は次の ID で公開されていました: JP112649

概要

Microsoft Visual C++ に付属の SPY++ では、ウィンドウのクラス名などの情報を取得することができます。この記事では、Visual Basic で作成するアプリケーションでも、同じようにウィンドウのクラス名や属性を取得するための方法について説明します。これらの情報は、Microsoft Windows Application Programming Interface (Windows API) のファンクションを使用する場合に必要になることがあります。

詳細

このサンプルでは、Windows API のファンクションを使い、現在カーソルのあるウィンドウについての情報を取得しています。まず最初に、現在のカーソル位置を取得するために GetCursorPos を呼び出します。次にその情報をもとに、現在カーソルが存在しているウィンドウのハンドルを WindowFromPoint を呼び出して取得します。そして、Windows API の他のいくつかのファンクションを呼び出して、そのウィンドウに関する特定の情報を取得します。

このサンプルでは、次のウィンドウ情報を取得しています。
  • ウィンドウ ハンドル
  • ウィンドウ テキスト
  • ウィンドウ クラス名
  • ウィンドウ ID 番号
  • 親ウィンドウ ハンドル (適用可能な場合)
  • 親ウィンドウ テキスト (適用可能な場合)
  • 親ウィンドウ クラス名 (適用可能な場合)
  • モジュール ファイル名
以下のサンプルは、得たいウィンドウ属性を取得する目的に応じた適切な windows API ファンクションを呼び出すことにより、簡単に拡張することができます。


ステップ バイ ステップ

  1. 新規の標準 EXE プロジェクトを作成します。デフォルトで Form1 が作成されます。
  2. フォームの General Declarations セクションに次のコードを貼り付けます。
            Private Type POINTAPI
               x As Long
               y As Long
            End Type
    
            Private Declare Function GetCursorPos Lib "User32" (lpPoint As _
               POINTAPI) As Long
            Private Declare Function WindowFromPointXY Lib "User32" Alias _
               "WindowFromPoint" (ByVal xPoint As Long, ByVal yPoint As Long) _
               As Long
            Private Declare Function GetModuleFileName Lib "kernel32" Alias _
               "GetModuleFileNameA" (ByVal hModule As Long, ByVal lpFileName As _
               String, ByVal nSize As Long) As Long
            Private Declare Function GetWindowWord Lib "User32" (ByVal hwnd As _
               Long, ByVal nIndex As Long) As Integer
            Private Declare Function GetWindowLong Lib "User32" Alias _
               "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As _
               Long
            Private Declare Function GetParent Lib "User32" (ByVal hwnd As _
               Long) As Long
            Private Declare Function GetClassName Lib "User32" Alias _
               "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As _
               String, ByVal nMaxCount As Long) As Long
            Private Declare Function GetWindowText Lib "User32" Alias _
               "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, _
               ByVal cch As Long) As Long
         Const GWW_HINSTANCE = (-6)
         Const GWW_ID = (-12)
         Const GWL_STYLE = (-16)
    
  3. フォームに Timer コントロール (Timer1) を配置します。
  4. Timer1 の Interval プロパティを 200 に設定します。
  5. フォームに次のコードを追加します。
         Sub Timer1_Timer()
            Dim pt32 As POINTAPI
            Dim ptx As Long
            Dim pty As Long
            Dim sWindowText As String * 100
            Dim sClassName As String * 100
            Dim hWndOver As Long
            Dim hWndParent As Long
            Dim sParentClassName As String * 100
            Dim wID As Long
            Dim lWindowStyle As Long
            Dim hInstance As Long
            Dim sParentWindowText As String * 100
            Dim sModuleFileName As String * 100
            Static hWndLast As Long
    
            Call GetCursorPos(pt32)                   ' カーソル位置を取得
            ptx = pt32.x
            pty = pt32.y
            ' カーソルの位置しているウィンドウを取得
            hWndOver = WindowFromPointXY(ptx, pty)
            If hWndOver <> hWndLast Then              ' 変更があったら表示する
               hWndLast = hWndOver                    ' 変更の保存
               Cls                                      ' 描画のクリア
               Print "Window Handle: &H"; Hex(hWndOver) ' ウィンドウハンドルの表示
    
               r = GetWindowText(hWndOver, sWindowText, 100)     ' ウィンドウテキス
    ト 
               Print "Window Text: " & Left(sWindowText, r)
    
               r = GetClassName(hWndOver, sClassName, 100)       ' ウィンドウクラス
               Print "Window Class Name: "; Left(sClassName, r)
    
               lWindowStyle = GetWindowLong(hWndOver, GWL_STYLE) ' ウィンドウスタイ
    ル
               Print "Window Style: &H"; Hex(lWindowStyle)
    
               ' 親ウィンドウハンドルの取得
               hWndParent = GetParent(hWndOver)
    
               ' 親ウィンドウがあれば、さらに情報を取得
               If hWndParent <> 0 Then
                  ' ウィンドウ ID の取得
                  wID = GetWindowWord(hWndOver, GWW_ID)
                  Print "Window ID Number: &H"; Hex(wID)
                  Print "Parent Window Handle: &H"; Hex(hWndParent)
    
                  ' 親ウィンドウテキストの取得
                  r = GetWindowText(hWndParent, sParentWindowText, 100)
                  Print "Parent Window Text: " & Left(sParentWindowText, r)
    
                  ' 親ウィンドウクラス名の取得
                  r = GetClassName(hWndParent, sParentClassName, 100)
                  Print "Parent Window Class Name: "; Left(sParentClassName, r)
               Else
                  ' 親ウィンドウがないとき
                  Print "Window ID Number: N/A"
                  Print "Parent Window Handle: N/A"
                  Print "Parent Window Text : N/A"
                  Print "Parent Window Class Name: N/A"
               End If
    
               ' ウィンドウインスタンスの取得
               hInstance = GetWindowWord(hWndOver, GWW_HINSTANCE)
    
               ' モジュール名の取得
               r = GetModuleFileName(hInstance, sModuleFileName, 100)
               Print "Module: "; Left(sModuleFileName, r)
            End If
         End Sub
    
  6. プロジェクトファイルを保存します。
  7. 実行し、他のウィンドウにマウスを移動します。マウスを異なるウィンドウ上に移動させるたびに、フィールドの値が変わることを確認できます。

関連情報

  • Microsoft Windows Software Development Kit (SDK)
  • Microsoft Visual Basic for Windows SDK ヘルプ ファイル

関連情報

この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 112649 (最終更新日 1999-01-14) を基に作成したものです。


Additional query words: ClassName FindWindow

Keywords: KBHOWTO VB5 VB6 KB112649
Technology: kbAudDeveloper kbVB16bitSearch kbVB300 kbVB300Search kbVB400 kbVB400Search kbVB500 kbVB500Search kbVBSearch kbZNotKeyword2 kbZNotKeyword6

inserted by FC2 system