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で取得して確認してみましょう。
  1. Option Explicit  
  2.   
  3. Declare Function GetClassName Lib "user32" Alias "GetClassNameA" _  
  4.     (ByVal hwnd As LongByVal lpClassName As StringByVal nMaxCount As LongAs Long  
  5. Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" _  
  6.     (ByVal lpClassName As StringByVal lpWindowName As StringAs Long  
  7.   
  8. Sub SampleCode()  
  9.     '電卓のクラス名がSciCalcであることをGetClassNameを使って確かめてみる  
  10.     Dim hwnd As Long  
  11.     hwnd = FindWindow("SciCalc""電卓")  
  12.       
  13.     Dim ClassName As String, Ret As Long  
  14.     ClassName = String(255, vbNullChar) 'クラス名が何文字か不明なので大きめの領域を確保しておく  
  15.   
  16.     Ret = GetClassName(hwnd, ClassName, 255)  
  17.   
  18.     Debug.Print Left(ClassName, InStr(ClassName, vbNullChar) - 1)  
  19. End Sub  
実行すると、SciCalcの文字が取得できます。
これで、FindWindows関数を使いたいけどクラス名がわからなくて使えない…
って場合に、EnumWindowでウィンドウ名から事前にハンドルを取得し
GetClassNameでクラス名を調べてしまえば、FindWindow関数で
ハンドルを取得することも可能になるわけですね。

0 件のコメント: