已知窗体的句柄,如何显示出此窗体 C#.ne

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了已知窗体的句柄,如何显示出此窗体 C#.ne相关的知识,希望对你有一定的参考价值。

上次在网上查到了方法,也实现了,然后代码不知道丢哪了,现在想实现却做不出来了,只记得好像是用findWindow方法来实现。
现在网上又查不到了,是不是句柄的作用的重点不在显示出相应的窗体,而是在于其它?谢谢指点。。。。

知道窗体的句柄,要显示窗体,使用 API

ShowWindow(句柄, 1);
//1 是显示, 0是隐藏
参考技术A ::ShowWindow(hWnd, SW_SHOW);

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。

以上是关于已知窗体的句柄,如何显示出此窗体 C#.ne的主要内容,如果未能解决你的问题,请参考以下文章

在VB里面如何用postmessage函数向已知句柄的窗体发送单击鼠标的消息

vb 通过句柄将外部程序 设为本程序的子窗体 并 改变其窗体大小

知道一个窗体的句柄,如何获取这个窗体

如何获取窗体中组件的句柄

vb如何获取到窗口的句柄

vb 句柄怎么用