请问如何 将 shell 调用的程序界面显示在 当前 的mid窗口内呢?

解决方案 »

  1.   

    Option ExplicitPublic Const GW_HWNDNEXT = 2Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
    Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
    Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Long, ByVal lpWindowName As Long) As Long
    Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
    Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
    Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long' Return the window handle for an instance handle.
    Function InstanceToWnd(ByVal target_pid As Long) As Long
        Dim test_hwnd As Long
        Dim test_pid As Long
        Dim test_thread_id As Long    ' Get the first window handle.
        test_hwnd = FindWindow(ByVal 0&, ByVal 0&)    ' Loop until we find the target or we run out
        ' of windows.
        Do While test_hwnd <> 0
            ' See if this window has a parent. If not,
            ' it is a top-level window.
            If GetParent(test_hwnd) = 0 Then
                ' This is a top-level window. See if
                ' it has the target instance handle.
                test_thread_id = GetWindowThreadProcessId(test_hwnd, test_pid)            If test_pid = target_pid Then
                    ' This is the target.
                    InstanceToWnd = test_hwnd
                    Exit Do
                End If
            End If        ' Examine the next window.
            test_hwnd = GetWindow(test_hwnd, GW_HWNDNEXT)
        Loop
    End Function
      

  2.   

    Option ExplicitPrivate Notepad_OldParent&
    Private Calc_OldParent&
    Private Notepad_Hwnd&
    Private Calc_Hwnd&
    Private Sub mnuClose_Click()
    Unload Me
    End SubPrivate Sub mnuOpenCalc_Click()
        Dim pid As Long
        Dim buf As String
        Dim buf_len As Long
        Dim styles As Long    pid = Shell("calc.exe", vbNormalFocus)
        If pid = 0 Then
            MsgBox "Error starting program"
            Exit Sub
        End If    Calc_Hwnd& = InstanceToWnd(pid)    Calc_OldParent& = SetParent(Calc_Hwnd&, Me.hwnd)    mnuOpenCalc.Enabled = False
        mnuResCalc.Enabled = True
    End SubPrivate Sub mnuOpenNotepad_Click()
        Dim pid As Long
        Dim buf As String
        Dim buf_len As Long
        Dim styles As Long    pid = Shell("notepad.exe", vbNormalFocus)
        If pid = 0 Then
            MsgBox "Error starting program"
            Exit Sub
        End If    Notepad_Hwnd& = InstanceToWnd(pid)    Notepad_OldParent& = SetParent(Notepad_Hwnd&, Me.hwnd)    mnuOpenNotepad.Enabled = False
        mnuResNotepad.Enabled = True
    End SubPrivate Sub mnuResCalc_Click()
        SetParent Calc_Hwnd&, Calc_OldParent&    mnuOpenCalc.Enabled = True
        mnuResCalc.Enabled = False
    End SubPrivate Sub mnuResNotepad_Click()
        SetParent Notepad_Hwnd&, Notepad_OldParent&    mnuOpenNotepad.Enabled = True
        mnuResNotepad.Enabled = False
    End Sub