|
▼ON さん:
このサンプルは理解の助けになるでしょうか?
GetAllWindowsClassName
を実行すると、Sheet1にExcelアプリケーションの子ウィンドウのクラス名と、
そのウィンドウのTitleバーのText列挙されます。
これで複数のBookがあっても、各Bookのクラス名とtitleが取得できます。
Private Declare Function EnumChildWindows Lib "user32.dll" _
(ByVal hWndParent As Long, _
ByVal lpEnumFunc As Long, _
lParam As Long) As Long
Private Declare Function FindWindow Lib "user32" _
Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" _
Alias "FindWindowExA" _
(ByVal hWnd1 As Long, _
ByVal hWnd2 As Long, _
ByVal lpsz1 As String, _
ByVal lpsz2 As String) As Long
Private Declare Function GetClassName Lib "user32.dll" _
Alias "GetClassNameA" _
(ByVal hWnd As Long, _
ByVal lpClassName As String, _
ByVal nMaxCount As Long) As Long
Private Declare Function GetWindowText Lib "user32.dll" _
Alias "GetWindowTextA" _
(ByVal hWnd As Long, _
ByVal lpString As String, _
ByVal nMaxCount As Long) As Long
Private Const cExcelClassName As String = "XLMAIN"
Private Sub GetAllWindowsClassName()
Dim hWnd As Long
Dim sBuf As String * 512
Dim sTitle As String
Dim lret As Long
hWnd = FindWindow(cExcelClassName, Application.Caption)
lret = GetWindowText(hWnd, sBuf, Len(sBuf))
sTitle = Left(sBuf, InStr(sBuf, vbNullChar) - 1)
With Worksheets("Sheet1")
.Range("A1").Value = "ClassName"
.Range("B1").Value = "Caption"
.Range("A2").Value = cExcelClassName
.Range("B2").Value = sTitle
End With
Call EnumChildWindows(hWnd, AddressOf EnumChildWindowsProc, 0&)
End Sub
'これはどこかにあった奴を保存してたので改造して使ってます。
Private Function EnumChildWindowsProc(ByVal hChild As Long, _
lParam As Long) As Long
Dim sBuff As String * 128
Dim sBuff2 As String * 516
Dim ret As Long
Dim sClassName As String
Dim sTitle As String
Dim lCount As Long
lCount = GetLoastRow + 1
'クラス名取得
ret = GetClassName(hChild, sBuff, Len(sBuff))
sClassName = Left(sBuff, InStr(sBuff, vbNullChar) - 1)
ret = GetWindowText(hChild, sBuff2, Len(sBuff2))
sTitle = Left(sBuff2, InStr(sBuff2, vbNullChar) - 1)
Worksheets("Sheet1").Range("A" & CStr(lCount)).Value = sClassName
Worksheets("Sheet1").Range("B" & CStr(lCount)).Value = sTitle
EnumChildWindowsProc = True
End Function
Private Function GetLoastRow() As Long
Dim ret As Long
ret = Worksheets("Sheet1").Range("A" & CStr(Application.Rows.Count)).End(xlUp).Row
GetLoastRow = ret
End Function
以下APIの解説
ht tp://msdn.microsoft.com/ja-jp/library/cc364600.aspx
ht tp://msdn.microsoft.com/ja-jp/library/cc410802.aspx
ht tp://msdn.microsoft.com/ja-jp/library/cc410835.aspx
ht tp://msdn.microsoft.com/ja-jp/library/cc410853.aspx
ht tp://msdn.microsoft.com/ja-jp/library/cc364815.aspx
>ちょっと気になっているのが
??activewindow.Application.Caption
?での返り値は
>ブックのウインドウが最大化されていないとき:Microsoft Excel
>ブックのウインドウが最大化されているとき :Microsoft Excel - hoge.xls
なんですが、ExcelはMDIアプリケーションなのでその子ウィンドウ
(この場合Book)が最大化された時、親ウィンドウのタイトルバー(一番上の
閉じるボタンなどがある所)に
Microsoft Excel - hoge.xls
となるのは
そういうスタイル指定は出来なかったと思うので、MDIWindowの仕様のような
気がします。・・・・自信なし
|
|