注册 登录
编程论坛 VB6论坛

VB 在我的窗口内,运行外部程序

张六先生 发布于 2022-09-11 19:48, 2508 次点击
在我的窗口内,运行我工作,同时需要打开 explorer.exe 和 WeChat.exe 与我并行工作。同时打开,并不因我的工作而失去两个外部程序的工作界面。拜托各位大侠,详细程序指导。
13 回复
#2
kings123332022-09-11 20:16
交界面隐藏,同时内存时时取数来关联验证连接是否正常,取数是否正常,多么美好的事情。
#3
yuma2022-09-12 17:10
你们两个在说什么?楼主又想表达什么?
#4
apull2022-09-12 17:48
Shell "explorer"
Shell ""C:\Program Files (x86)\Tencent\WeChat\WeChat.exe""
#5
张六先生2022-09-13 14:32
感谢各位朋友。
我想表达的意思是,我的界面,资源管理器的界面(explorer),微信界面。同时在我的窗口显示,不因我操作我的界面而影响另两个界面的观察和使用。

如果按 Shell 的方法,当我在操作我的界而,两个 Shell 就自动关闭了。

是否可以,在我的界面上再开两个窗口,把explorer和 微信 在两个新窗口中打开。
#6
apull2022-09-13 14:36
你的意思是你要把2个窗口捕捉为你程序窗口的子窗口么?这个可有难度了,尤其是微信,对于这方面做了多次加密和干扰。
#7
yuma2022-09-13 14:42
我来个单窗口的,代码你自己改。

注意:运行后,把Form 窗口最大化看效果。

程序代码:
Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Long, ByVal lpWindowName As Long) As Long
Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function LockWindowUpdate Lib "user32" (ByVal hwndLock As Long) As Long
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function Putfocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long

Private Const GW_HWNDNEXT = 2
Private m_Hwnd As Long

Private Sub Form_Load()
    Dim dblPid As Long
    Call LockWindowUpdate(GetDesktopWindow)
    dblPid = Shell("c:\windows\notepad.exe", vbNormalFocus)
    m_Hwnd = InstanceToWnd(dblPid) '根据进程PID找窗口句柄
    SetParent m_Hwnd, Me.hwnd
    Putfocus m_Hwnd                 '记事本设置焦点
    Call LockWindowUpdate(0)
End Sub

Function InstanceToWnd(ByVal target_pid As Long) As Long
    Dim i As Long, lHwnd As Long, lPid As Long, lThreadId As Long
    lHwnd = FindWindow(ByVal 0&, ByVal 0&)   '查找第一个窗口
    Do While lHwnd <> 0
        i = i + 1
        If i Mod 20 = 0 Then DoEvents
        '判断窗口是否没父窗口
        If GetParent(lHwnd) = 0 Then
            '获取该窗口的线程ID
            lThreadId = GetWindowThreadProcessId(lHwnd, lPid)
            If lPid = target_pid Then '找到PID所在窗口句柄
                InstanceToWnd = lHwnd
                Exit Do
            End If
        End If
        '继续查找下一个兄弟窗口
        lHwnd = GetWindow(lHwnd, GW_HWNDNEXT)
        Debug.Print Hex$(lHwnd)
    Loop
End Function

Private Sub Form_Unload(Cancel As Integer)
    Call DestroyWindow(m_Hwnd)
    'TerminateProcess GetCurrentProcess, 0    '野蛮了些
    Set Form1 = Nothing
End Sub


[此贴子已经被作者于2022-9-13 14:44编辑过]

#8
kings123332022-09-13 17:55
回复 5楼 张六先生
这不就是嵌入吗?
#9
yuma2022-09-13 18:33
你说是嵌入就是嵌入吧,你的意思大致是这样的,我的理解。
#10
chenyucheng2022-09-13 19:56
嵌入是正确的,像MDI那样子
#11
约定的童话2022-09-14 03:47
这样做的目的是啥?
#12
张六先生2022-09-14 09:43
感谢个位大师的帮助。到目前仍没有好的办法解决,其中“代码”段回帖我试过了,没有达到要求。不过还是感谢!!!
#13
yuma2022-09-14 10:48
回复 11楼 约定的童话
不想再在这个论坛回复问题了,没有意思。哎。。。。
#14
约定的童话2022-09-14 16:03
你是要爬取微信公众号里面的文章内容吗?
1