|
▼ハチ さん:
>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
ごゆっくりどうぞ^ ^
|
|