vb 将一个程序通过句柄设为了另一个程序的子窗体后句柄发生改变 如何获取该程序在父窗体的新句柄?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vb 将一个程序通过句柄设为了另一个程序的子窗体后句柄发生改变 如何获取该程序在父窗体的新句柄?相关的知识,希望对你有一定的参考价值。

如题。 我用FindWindow获取一个程序的句柄, SetParent设置为子窗体, SetWindowPos设置在子窗体中的位置。现在我找到种种证据已证明其被设为子窗体后句柄发生改变, 我如何可以在上面的基础上获得该程序的新句柄?ps:被设为子窗体的程序有重名 所以请尽量不要用查找进程名的函数。 我想要具体源码,谢谢。

我也有种种证据证明你的看法是错误的,比如下面的代码:

Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Dim oParent As Long, npad As Long  'oParent是原来的父窗口句柄,npad是记事本句柄

Private Sub Command1_Click()
Shell "notepad.exe", vbNormalFocus    '打开记事本
End Sub

Private Sub Command2_Click()
npad = FindWindow(vbNullString, "无标题 - 记事本")  '获取记事本句柄
oParent = SetParent(npad, Me.hWnd)    '把记事本设为自己的一个子窗口
End Sub

Private Sub Command3_Click()
SetParent npad, oParent '把记事本还原为桌面窗口。注意这时候用的句柄还是原来的!
End Sub

结论就是:把一个窗体设为另一个窗体的子窗体后,其句柄是不会发生改变的!因为句柄是窗体在内存中的唯一“身份证”,如果可以随便改变的话操作系统就无法对其进行有效控制了!

唯一会发生句柄改变的情况,就是该窗体先Unload,然后再Load,这样就相当于重新建立一个新窗口了,但其原来的子窗体身份也会自动解除。

值得说明的就是,当把一个窗体设为另一个窗体的子窗体后,你用FindWindow在桌面上是找不到该窗口的,必须先找到其新的父窗体,再遍历其子窗体才能找到,最好用FindWindowEx。

参考技术A 1.设置后,句柄应该是不会发生改变的。可能你得到的句柄不是程序窗口的句柄,而是放在程序窗口上某个控件的句柄。
2.改变的话,可以通过EnumWindows函数去查找。比如先得到程序窗口自己的句柄A,然后FindWindow得到一个个句柄B,GetParent得到句柄B的父窗口句柄C,如果A=C,B符合要求的话,返回B。

以上是关于vb 将一个程序通过句柄设为了另一个程序的子窗体后句柄发生改变 如何获取该程序在父窗体的新句柄?的主要内容,如果未能解决你的问题,请参考以下文章

vb中怎样将一个窗体设为MDI的子窗体

c# 设置窗体句柄

vb如何获得一个正在运行程序的窗体名称

VC++中怎样获取到一个窗体的句柄?

delphi获取窗体的句柄

vb的 mdi窗口的问题