2012年5月16日水曜日

[ExcelVBA] GetClassName


■説明
ウィンドウが属するクラスのな前を取得する

■宣言
Declare Function GetClassName Lib "user32" Alias "GetClassNameA"
(ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
第一引数:ウィンドウのハンドルを指定
第二引数:クラス名を格納するための変数を指定
第三引数:APIが返す最大のバイト数を指定(一番最後はNull?)
戻り値:失敗した時0を返します

■サンプルコード
電卓のクラス名はSciCalcなのでGetClassNameで取得して確認してみましょう。
Option Explicit

Declare Function GetClassName Lib "user32" Alias "GetClassNameA" _
    (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Sub SampleCode()
    '電卓のクラス名がSciCalcであることをGetClassNameを使って確かめてみる
    Dim hwnd As Long
    hwnd = FindWindow("SciCalc", "電卓")
    
    Dim ClassName As String, Ret As Long
    ClassName = String(255, vbNullChar) 'クラス名が何文字か不明なので大きめの領域を確保しておく

    Ret = GetClassName(hwnd, ClassName, 255)

    Debug.Print Left(ClassName, InStr(ClassName, vbNullChar) - 1)
End Sub
実行すると、SciCalcの文字が取得できます。
これで、FindWindows関数を使いたいけどクラス名がわからなくて使えない…
って場合に、EnumWindowでウィンドウ名から事前にハンドルを取得し
GetClassNameでクラス名を調べてしまえば、FindWindow関数で
ハンドルを取得することも可能になるわけですね。

0 件のコメント: