我赞成 crazy0qwer 的意见,同时鄙视zx001z 照搬抄袭,还运行一个带这样提示的s1.exe
要注意的是 比如计算器 在 切换 科学 和 普通的时候 句柄会变化,,另外有的程序加载的慢,导致在查找句柄的时候还没建立窗体,所以查不到句柄设置失败, 有的窗体运行后不是最前端也会导致失败。所以最好用 API FINDWINDOW 来查找句柄而不是 GetForegroundWindow 获得前端的句柄
用 findwindowex 可以查到所有的句柄声明如下
Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
下面是个简单的例子,具体需要你自己研究
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Declare Function MoveWindow Lib "user32" (ByVal Hwnd As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long
Private Sub Command1_Click()
Dim Hwnd As Long
Shell "calc.exe", vbNormalFocus
Hwnd = GetForegroundWindow
SetParent Hwnd, Me.Hwnd
MoveWindow Hwnd, 0, 0, 200, 200, 1 ' 0,0 是位置,200,200是宽度和高度
End Sub
用API函数
SetParent声明方法:
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
函数功能:该函数改变某个子窗口的父窗口。
函数原型:HWND SetParent(HWND hWndChild,HWND hWndNewParent);
参数:
hWndChild:子窗口句柄。
hWndNewParent:新的父窗口句柄。如果该参数是NULL,则桌面窗口就成为新的父窗口。在WindowsNT5.0中,如果参数为HWND_MESSAGE,则子窗口成为消息窗口。
返回值:如果函数成功,返回值为子窗口的原父窗口句柄;如果函数失败,返回值为NULL。若想获得多错误信息,请调用GetLastError函数。
备注:应用程序可以使用SetParent函数来设置弹出式窗口,层叠窗口或子窗口的父窗口。新的窗口与窗口必须属于同一应用程序。
如果参数hWndChild标识的窗口是可见的,系统将执行适当的重画和刷新动作。
由于兼容的原因,对于将改变父窗口的子窗口,SetParent函数并不改变该子窗口的WS_CHILD WS_POPUP风格。所以,如果hWndNewParent参数为NULL,就应在调用SetParent函数之后清空WS_CHILD位并且设置为WS_POPUP风格。相反的,如果hWndNewParent参数不为NULL并且在此之前窗口是桌面窗口的子窗口,就应在调用SetParent函数之前清空WS_POPUP位井设置WS_CHILD风格。
速查:Windows NT:3.1以上版本;Windows:95以上版本;Windows CE:1.0以上版本:头文件:Winuser.h;库文件:user32.lib。