VB中如何通过句柄获得窗体

bbvoxkane14 2008-04-18 02:11:02
我现在遇到一个问题,我在使用自定义控件过程中需要获得使用控件的窗体对象。

我知道可以使用UserControl.Parent来获得,但是,我自定义的这个控件需要在VC中调用,在VC中调用时无法执行UserControl.Parent,执行到这里就会报错
所以我通过VC将窗体的句柄hWnd传递到控件中,现在问题出现了,如何通过这个句柄来获得这个窗体对象,这就是我的问题,希望各位高手指点。

谢谢~~
...全文
1193 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
bbvoxkane14 2008-04-23
  • 打赏
  • 举报
回复
谢谢大家的帮助,始终没有找到解决问题的方法,现在的解决问题的方法就是,用VC重写VB的控件
(T_T)好大的工作量呢~~~(T_T)

不过还是要谢谢大家,见者有分,再次谢谢大家
sandy_zc_1 2008-04-19
  • 打赏
  • 举报
回复
LZ不要试图去用Form之类的窗体对象来操作窗口,而要使用Win32API。在VC中窗口可不是和VB一样的COM类。
sonic_andy 2008-04-19
  • 打赏
  • 举报
回复
userdocument在创建的时候应该可以返回创建的窗体对象吧?
比如createtoolwindow函数就可以.
smoked 2008-04-19
  • 打赏
  • 举报
回复
VC 我不懂, VB 里似乎没办法直接由句柄返回对象实例, 一段时间前我就被这问题弄得焦头烂额.

间接的法子, 枚举窗体, 逐个比较句柄.
dyy830606 2008-04-18
  • 打赏
  • 举报
回复
Dim hWnd1 As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Const SWP_HIDEWINDOW = &H80
Const SWP_SHOWWINDOW = &H40

Private Sub Command2_Click()
hWnd1 = FindWindow("Shell_traywnd", "")
Call SetWindowPos(hWnd1, 0, 0, 0, 0, 0, SWP_SHOWWINDOW)
Unload Me
End Sub
Private Sub Command1_Click()
hWnd1 = FindWindow("Shell_traywnd", "")
Call SetWindowPos(hWnd1, 0, 0, 0, 0, 0, SWP_HIDEWINDOW)
Form1.WindowState = 2
End Sub
蒋晟 2008-04-18
  • 打赏
  • 举报
回复
你获取之后要做什么?这是违反COM规范的
你应该触发事件,在容器中捕获事件,然后决定该怎么做
bbvoxkane14 2008-04-18
  • 打赏
  • 举报
回复
谢谢YFY的帮助
但是现在还有一个问题,这个API具体是怎么用的呀?

还是不大明白怎么获得具体窗体对象
YFY 2008-04-18
  • 打赏
  • 举报
回复
调用相关与你要实现的功能有关的API。

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更为可靠

GetWindowDC

VB声明
Declare Function GetWindowDC Lib "user32" Alias "GetWindowDC" (ByVal hwnd As Long) As Long
说明
获取整个窗口(包括边框、滚动条、标题栏、菜单等)的设备场景
返回值
Long,执行成功为窗口设备场景,失败则为0
参数表
参数 类型及说明
hwnd Long,将获取其设备场景的窗口
注解
不推荐在vb里使用这个函数。用完后一定要用ReleaseDC函数释放场景

YFY 2008-04-18
  • 打赏
  • 举报
回复
API函数:
GetWindowLong
SetWindowLong
可以通过句柄获得窗体信息。

GetWindowLong

VB声明
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
说明
从指定窗口的结构中取得信息
返回值
Long,由nIndex决定。零表示出错。会设置GetLastError
参数表
参数 类型及说明
hwnd Long,欲为其获取信息的窗口的句柄
nIndex Long,欲取回的信息,可以是下述任何一个常数:
GWL_EXSTYLE 扩展窗口样式
GWL_STYLE 窗口样式
GWL_WNDPROC 该窗口的窗口函数的地址
GWL_HINSTANCE 拥有窗口的实例的句柄
GWL_HWNDPARENT 该窗口之父的句柄。不要用SetWindowWord来改变这个值
GWL_ID 对话框中一个子窗口的标识符
GWL_USERDATA 含义由应用程序规定
DWL_DLGPROC 这个窗口的对话框函数地址
DWL_MSGRESULT 在对话框函数中处理的一条消息返回的值
DWL_USER 含义由应用程序规定

SetWindowLong

VB声明
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
说明
在窗口结构中为指定的窗口设置信息
返回值
Long,指定数据的前一个值
参数表
参数 类型及说明
hwnd Long,欲为其取得信息的窗口的句柄
nIndex Long,请参考GetWindowLong函数的nIndex参数的说明
dwNewLong Long,由nIndex指定的窗口信息的新值

如果截获窗体消息处理过程,可按如下:
初始时:
gprevWndproc = GetWindowLong(hwnd, GWL_WNDPROC) '* 获取当前消息处理句柄
SetWindowLong hwnd, GWL_WNDPROC, AddressOf WndProc '* 设置当前消息处理函数

结束时:
SetWindowLong hwnd, GWL_WNDPROC, gprevWndproc '* 恢复消息Windows处理

gprevWndproc 为全局变量,WndProc 为自定义消息函数
bbvoxkane14 2008-04-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 YFY 的回复:]
楼主:你已经获得VC传入的窗体句柄,不就可以通过该句柄对该窗体进行操作了吗?你是想通过窗体实现什么功能?
[/Quote]

我现在需要在VB中创建的自定义控件中,反向操作他所在的窗体,而通过UserControl.Parent无法获得,所以我需要在VB控件中,通过句柄来获得窗体。

所以就有了我的问题,在VB中如何通过窗体的句柄来获得窗体对象。
YFY 2008-04-18
  • 打赏
  • 举报
回复
楼主:你已经获得VC传入的窗体句柄,不就可以通过该句柄对该窗体进行操作了吗?你是想通过窗体实现什么功能?
bbvoxkane14 2008-04-18
  • 打赏
  • 举报
回复
哦~这么说吧,我用VB做个一个用户自定义控件,这个控件在VC中使用

用VB测试控件的时候,没有问题,但是在VC中使用时就会因为调用UserControl.Parent而出错

所以,我从VC窗体中给控件传递一个窗体的句柄进去

现在遇到的问题,如何能够通过这个句柄在VB的空间中获得窗体对象

或者更直白的说

在VB中,我已知窗体的句柄,如何通过这个句柄来获得句柄所对应的窗体。
gracexu 2008-04-18
  • 打赏
  • 举报
回复
不明白楼主在说什么,一会儿说控件要在VC 中用,一会儿又从VC 传递句柄,你到底在哪里做呀。
还是把代码贴上来吧。

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧