把它单独放在一个pictureBox中再用GetWindow取得PictureBox的子窗体句柄 即那个控件的句柄 GetWindow VB声明 Declare Function GetWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As Long, ByVal wCmd As Long) As Long 说明 获得一个窗口的句柄,该窗口与某源窗口有特定的关系 返回值 Long,由wCmd决定的一个窗口的句柄。如没有找到相符窗口,或者遇到错误,则返回零值。会设置GetLastError 参数表 参数 类型及说明 hwnd Long,源窗口 wCmd Long,指定结果窗口与源窗口的关系,它们建立在下述常数基础上: GW_CHILD 寻找源窗口的第一个子窗口 GW_HWNDFIRST 为一个源子窗口寻找第一个兄弟(同级)窗口,或寻找第一个顶级窗口 GW_HWNDLAST 为一个源子窗口寻找最后一个兄弟(同级)窗口,或寻找最后一个顶级窗口 GW_HWNDNEXT 为源窗口寻找下一个兄弟窗口 GW_HWNDPREV 为源窗口寻找前一个兄弟窗口 GW_OWNER 寻找窗口的所有者 注解 兄弟或同级是指在整个分级结构中位于同一级别的窗口。如某个窗口有五个子窗口,那五个窗口就是兄弟窗口。尽管GetWindow可用于枚举窗口,但倘若要在枚举过程中重新定位、创建和清除窗口,那么EnumWindows和EnumChildWindows更为可靠
UP 我就是用EnumChildWindows取得Swflash.ocx控件的句柄的。 不过,最好要知道类名。这样才可以通过类名判断是不是你要的控件。
贴这点代码,如果不能看懂,请给我你的Email。我发一个例子给你。Public Function EnumChildProc(ByVal hwnd As Long, _ ByVal lParam As Long) As Long '这个回调函数通过过滤所有的子窗口的类名,来判断是不是 Flash 控件, '如果 Form 里的控件(子窗口)太多的话一定会影响启动速度的。我发现 '这个函数是从 TabIndex 最大的控件开始过滤的,也就是说,如果在设计 '窗体界面的时候最后才放置 Flash 控件的话,你就会第一个找到它的句柄 '了。而且 Flash 控件的类名会随着它的版本的不同而不同,所以我就用了 '一个 Like 语句。 'If GetClsName(hwnd) = "ATL:100536D0" Then 'If GetClsName(hwnd) = "ATL:582236D0" Then If GetClsName(hwnd) Like "ATL:????????" Then flaHwnd = hwnd Hook flaHwnd EnumChildProc = 0 Else EnumChildProc = 1 End If End Function Public Function GetClsName(ByVal hwnd As Long) As String Dim xLen As Long Dim sBuffer As String sBuffer = String(255, 0) xLen = GetClassName(hwnd, sBuffer, 255) If xLen = 0 Then GetClsName = "" Else GetClsName = Left(sBuffer, xLen) End If End Function
即那个控件的句柄
GetWindow VB声明
Declare Function GetWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
说明
获得一个窗口的句柄,该窗口与某源窗口有特定的关系
返回值
Long,由wCmd决定的一个窗口的句柄。如没有找到相符窗口,或者遇到错误,则返回零值。会设置GetLastError
参数表
参数 类型及说明
hwnd Long,源窗口
wCmd Long,指定结果窗口与源窗口的关系,它们建立在下述常数基础上:
GW_CHILD 寻找源窗口的第一个子窗口
GW_HWNDFIRST 为一个源子窗口寻找第一个兄弟(同级)窗口,或寻找第一个顶级窗口
GW_HWNDLAST 为一个源子窗口寻找最后一个兄弟(同级)窗口,或寻找最后一个顶级窗口
GW_HWNDNEXT 为源窗口寻找下一个兄弟窗口
GW_HWNDPREV 为源窗口寻找前一个兄弟窗口
GW_OWNER 寻找窗口的所有者
注解
兄弟或同级是指在整个分级结构中位于同一级别的窗口。如某个窗口有五个子窗口,那五个窗口就是兄弟窗口。尽管GetWindow可用于枚举窗口,但倘若要在枚举过程中重新定位、创建和清除窗口,那么EnumWindows和EnumChildWindows更为可靠
我就是用EnumChildWindows取得Swflash.ocx控件的句柄的。
不过,最好要知道类名。这样才可以通过类名判断是不是你要的控件。
ByVal lParam As Long) As Long
'这个回调函数通过过滤所有的子窗口的类名,来判断是不是 Flash 控件,
'如果 Form 里的控件(子窗口)太多的话一定会影响启动速度的。我发现
'这个函数是从 TabIndex 最大的控件开始过滤的,也就是说,如果在设计
'窗体界面的时候最后才放置 Flash 控件的话,你就会第一个找到它的句柄
'了。而且 Flash 控件的类名会随着它的版本的不同而不同,所以我就用了
'一个 Like 语句。 'If GetClsName(hwnd) = "ATL:100536D0" Then
'If GetClsName(hwnd) = "ATL:582236D0" Then
If GetClsName(hwnd) Like "ATL:????????" Then
flaHwnd = hwnd
Hook flaHwnd
EnumChildProc = 0
Else
EnumChildProc = 1
End If
End Function
Public Function GetClsName(ByVal hwnd As Long) As String
Dim xLen As Long
Dim sBuffer As String
sBuffer = String(255, 0)
xLen = GetClassName(hwnd, sBuffer, 255)
If xLen = 0 Then
GetClsName = ""
Else
GetClsName = Left(sBuffer, xLen)
End If
End Function
[email protected]
谢谢。