| 
    
     |  | ▼ハチ さん: >APIぜんぜんわかりません ><
 >
 >あの最初に書く(Declareステートメントでしたっけ?)が難解ですね・・・
 >バグらせずに制御できる自信もないです・・・
 これ読んだんで、サンプル書きました。
 一応問題なく動きました。XP SP2 + Office2K
 ※Excel97では使用できません。
 
 サンプルは1個目と2個目のIEのHWNDを取得するだけのものですが、
 「'1個目のIEのHWND保存用」の変数を配列にでもして、EnumFuncでの
 比較時、複数のHWNDと比較してやれば、まだ取得してないIEのHWNDが
 取得でき、何個でも対応可能です。
 
 Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
 (ByVal lpClassName As String, _
 ByVal lpWindowName As String) As Long
 
 Private Declare Function EnumWindows Lib "user32" _
 (ByVal lpEnumFunc As Long, ByVal lparam 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 Const IEClassName As String = "IEFrame"   'IEのClass名
 Private Const XLClassName As String = "XLMAIN"   'XL2000
 Private Const MAX_PATH As Long = 255
 
 Private FirstIE As Long   '1個目のIEのHWND保存用
 Private OtherIE As Long   '戻り値用変数
 
 '1個目のHWND取得のみ
 Sub test_FindWindow()
 FirstIE = FindWindow(IEClassName, vbNullString)
 Debug.Print "1個目: " & FirstIE
 End Sub
 
 '2個目のHWND取得のみ
 Sub test_FindWindow2()
 Debug.Print "2個目: " & FindIE(FirstIE)
 End Sub
 
 Function FindIE(phWnd As Long) As Long
 Dim handle As Long
 Dim ret As Boolean
 Dim sTitle As String
 
 handle = FindWindow(XLClassName, Application.Caption)
 OtherIE = -1  '戻り値用変数の初期化
 
 ret = EnumWindows(AddressOf EnumFunc, phWnd)
 '取得できたら
 If ret = False And OtherIE > 0 Then
 FindIE = OtherIE
 End If
 
 End Function
 
 Private Function EnumFunc(ByVal hwnd As Long, _
 ByVal lparam As Long) As Boolean
 Dim sClassName As String * MAX_PATH
 Dim sbuf As String
 
 EnumFunc = True
 
 GetClassName hwnd, sClassName, MAX_PATH
 sbuf = Left(sClassName, InStr(1, sClassName, Chr(0)) - 1)
 If sbuf = IEClassName Then
 If hwnd <> lparam Then
 OtherIE = hwnd
 EnumFunc = False
 End If
 End If
 End Function
 
 ごゆっくりどうぞ^ ^
 
 |  |