如何实现以下效果:
  已知一个菜单程序AppA
  点击其中一个按钮,打开程序AppB,隐藏菜单窗口.
  当AppB程序关闭时,显示先前隐藏的菜单窗口.
--------------------------------------------
这两个程序都是由我编写的.
用什么方法能够较好的实现这种效果:消息?API?,请提供代码实例.

解决方案 »

  1.   

    用API ShowWindow在AppB程序的退出事件里写:
    Call ShowWindow(AppA窗口的句柄)
      

  2.   

    这个我知道,怎样在AppB里取得AppA窗口的句柄呢?
      

  3.   


    ShowWindow Declare Function ShowWindow Lib "user32" Alias "ShowWindow" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long 说明 
       控制窗口的可见性(在vb里使用:针对vb窗体及控件,请使用对应的vb属性) 
    返回值 
       Long,如窗口之前是可见的,则返回TRUE(非零),否则返回FALSE(零) 
    参数表 
       参数     类型及说明 
      hwnd      Long,窗口句柄,要向这个窗口应用由nCmdShow指定的命令 
      nCmdShow  Long,为窗口指定可视性方面的一个命令。请用下述任何一个常数 
     
              SW_HIDE   隐藏窗口,活动状态给令一个窗口 
              SW_MINIMIZE 最小化窗口,活动状态给令一个窗口 
              SW_RESTORE 用原来的大小和位置显示一个窗口,同时令其进入活动状态 
              SW_SHOW 用当前的大小和位置显示一个窗口,同时令其进入活动状态 
              SW_SHOWMAXIMIZED 最大化窗口,并将其激活 
              SW_SHOWMINIMIZED 最小化窗口,并将其激活 
              SW_SHOWMINNOACTIVE 最小化一个窗口,同时不改变活动窗口 
              SW_SHOWNA 用当前的大小和位置显示一个窗口,不改变活动窗口 
              SW_SHOWNOACTIVATE 用最近的大小和位置显示一个窗口,同时不改变活动窗口 
              SW_SHOWNORMAL 与SW_RESTORE相同
      

  4.   

    如果知道AppA的窗口标题,可以用FindWindow来取得它的句柄:Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    dim whwnd as long 
    whwnd=FindWindow(vbnullstring,"AppA的窗口标题")
      

  5.   

    FindWindow可以实现,可以另AppA窗口居中显示吗?
      

  6.   

    //FindWindow可以实现,可以另AppA窗口居中显示吗?可以,用movewindow
      

  7.   

    这个问题的思路主要有两种:
    1 像 faysky2() 说的那样,处理AppB程序的退出事件,这种办法的缺点是,如果AppB是非正常关闭,则实现不了预期的效果2 AppA中调用了AppB之后,在AppA中不停的查找AppB,如果找不到,就进行处理,这种办法的缺点是比较浪费资源
      

  8.   

    '居中显示窗口的问题我已经实现了,虽然好象复杂了一点
    '用了GetDesktopWindow,和SetWindowPos
    '-----------------------------------------------------------------------------------
    Private Sub Form_Unload(Cancel As Integer)
        Dim whwnd As Long
        Dim wRect As RECT, dRect As RECT
        whwnd = FindWindow(vbNullString, "南琼考试系统")
        If whwnd <> 0 Then
            Call GetWindowRect(whwnd, wRect)
            Call GetWindowRect(GetDesktopWindow, dRect)
            
            Call SetWindowPos(whwnd, HWND_TOP, (dRect.Right - (wRect.Right - wRect.Left)) / 2, (dRect.Bottom - (wRect.Bottom - wRect.Top)) / 2, wRect.Right - wRect.Left, wRect.Bottom - wRect.Top, SWP_NOSIZE)
            Call ShowWindow(whwnd, 9)
        End If
    End Sub
    '-----------------------------------------------------------------------------------
    '谁再讲讲 rainstormmaster(暴风雨 v2.0) 提到的第二种方案
    '即不对AppB进行编码,在AppA对监视AppB是否正在运行.
      

  9.   

    //谁再讲讲 rainstormmaster(暴风雨 v2.0) 提到的第二种方案
    '即不对AppB进行编码,在AppA对监视AppB是否正在运行.关键是不停的查找,这个在do while循环(里面别忘了加doevents),或者在定时器中查找(查找就用findwindow)都可以