父窗口句柄

父窗口句柄,第1张

GetParentFrame函数可以得到父窗口框架,比如子窗口是A,则AGetParentFrame()就OK了。

具体参看MSDN。

Call this member function to retrieve the parent frame window//调用该函数返回父窗口框架。

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

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 "notepadexe", vbNormalFocus    '打开记事本

End Sub

Private Sub Command2_Click()

npad = FindWindow(vbNullString, "无标题 - 记事本")  '获取记事本句柄

oParent = SetParent(npad, MehWnd)    '把记事本设为自己的一个子窗口

End Sub

Private Sub Command3_Click()

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

End Sub

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

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

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

如果窗口是现有程序的,使用VS自带的spy++获取窗口的相关信息,然後使用WinAPI获取句柄,具体参考spy++的使用方法和winapi的使用

FindWindow(

lpClassName, {窗口的类名}

lpWindowName: PChar {窗口的标题}

): HWND; {返回窗口的句柄; 失败返回 0}

//FindWindowEx 比 FindWindow 多出两个句柄参数:

FindWindowEx(

Parent: HWND; {要查找子窗口的父窗口句柄}

Child: HWND; {子窗口句柄}

ClassName: PChar; {}

WindowName: PChar {}

): HWND;

如果窗口是你的程序动态生成的,使用如下语句

Form _FORM=new Form();

IntPtr _P = _FORMHandle;

_P就是你实例化的窗口句柄

thisParentControls

你是说这个

foreach (Control theC in thisControls)

{

if (theC is DataGridView)

{

在编程中,无论是子窗体还是父窗体,都能相互获取到句柄。甚至可以获取到当前程序之外的窗口句柄。至于你不能获取感觉上你是使用的类似句柄查找工具来查找窗口的句柄。这个在软件中是有办法进行屏蔽的。很复杂。。例如你不管用什么工具查找QQ登录的密码文本框句柄,怎么都查找不到,实际上是因为QQ用了其他手段来进行屏蔽。。。

以上就是关于父窗口句柄全部的内容,包括:父窗口句柄、vb 将一个程序通过句柄设为了另一个程序的子窗体后句柄发生改变 如何获取该程序在父窗体的新句柄、如何获取某个应用程序的窗体句柄等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/10046675.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-04
下一篇 2023-05-04

发表评论

登录后才能评论

评论列表(0条)

保存