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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vb 通过句柄将外部程序 设为本程序的子窗体 并 改变其窗体大小相关的知识,希望对你有一定的参考价值。

如题 我现在可以获得其句柄 实现设为子窗体, 但如何改变其窗体大小呢?(外部程序没有边框)
望写出代码供参考 谢谢。

有两个Win 32 的API能够改变窗口大小,跟目标窗口有没边框无关:

MoveWindow( ) 和 SetWindowPos( )

比如用 MoveWindow( ) 的:

Option Explicit

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 hWinWND As Long
   hWinWND = &HC018A    '实际窗口句柄你自己处理
   Call MoveWindow(hWinWND, 30, 120, 510, 300, 1)
End Sub

追问

额 这个不行啊 只是窗体位置发生了变化 但是尺寸并没改变 返回值为1
是不是要先改变外部程序的边框样式(.Borderstyle),改为可调尺寸的边框然后在进行这一命令呢?或者用SetWindowPos()可以实现么?

追答

如果真是这样,这也不是API的问题。
而是你的“目标窗口”自己在控制窗口大小!

不信,你可以自己用VB做一个窗口无边框的程序来试一下。
或者,你也可以新建一个标准EXE工程,画一个按钮,
  然后再画一个TextBox、PictureBox等有句柄的控件。
 把这个控件的句柄传给它,让它处理。
 你都能看到,它不仅可以移动控件的位置,也能改变控件的大小。
如果MoveWindow( ) 不能直到作用,你用 SetWindowPos( ) 同样也不行。

追问

那有什么办法可以解决吗 谢谢了

追答

晕,能有什么办法!
如果它自己随时在“维护窗口的大小”,你却偏要去改变,那不是自找麻烦?

你去分析它的程序文件吧,看它在哪“作怪”,你把它那段代码跳过(或全部NOP掉),就可以了。
(不知道你有这个功力没。反正我是做不到了 -_-!!! )
就是面对 非常、非常长 的一大片汇编代码,然后改它的指令…………
(用反编译工具来处理)

参考技术A 很简单用 sendmessage API

以上是关于vb 通过句柄将外部程序 设为本程序的子窗体 并 改变其窗体大小的主要内容,如果未能解决你的问题,请参考以下文章

delphi获取窗体的句柄

在winform嵌入外部应用程序

c# 设置窗体句柄

Delphi实现窗体内嵌其他应用程序窗体

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

怎么使用VB的窗体句柄打开窗体