【vb6.0】 如何判断窗体是否被遮挡,我想实现:当窗体显示但被遮挡时则移至上层,未被遮挡则隐藏;窗体隐藏时切换为显示
我想实现像千千静听那样的效果:
左键单击程序在托盘的图标进行切换窗体的显示/隐藏状态,即:
 1.当主界面为显示状态,但是被其他窗体遮挡(不是在最上层)的话,单击托盘图标则移至最上层(注意我并不要总是在最顶层),而如果在最上层,则切换到隐藏状态
 2.当主界面为隐藏状态,单击托盘图标则切换为显示状态,主界面在最上层(这个容易实现)所以请朋友看清楚了,我的难点是第1点,希望能够紧扣我的问题哦

解决方案 »

  1.   

    If GetTopWindow(0) <> Me.hWnd Then
        Call SetWindowPos(Me.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE)
    Else
        Me.Hide
    End If
      

  2.   

    To Tiger_Zhao :   困惑来了,当我的主界面窗体在最上层时,我用getTopwindow(0) 和 Me.hWnd 对比,竟然不同。只有我用代码把该窗体设定为最顶层时两者数值才一样。
        这正是我的问题的关键所在,即主界面看上去在最上层(未有被其他窗体遮挡,窗体为当前活动窗体),但实际上貌似不是在最上层。 
      

  3.   

    在程序启动时,主界面窗体显示,这个窗体应该是自动成为活动窗口的吧?可是我用GetActiveWindow得到的句柄和Me.hWnd的值也不一样啊。
    我用的窗体是BorderStyle=0,ShowInTaskbar=false
      

  4.   

    只要是的 TOPMOST 窗口(比如任务管理器设了选项“前端显示”),总是在普通窗口前面。
    如果有多个 TOPMOST 窗口,最近激活的在前面。即使两个窗口的显示区没有交叉,依旧存在前后关系。
    你的窗口不是最上层,只是表示存在可以覆盖你的窗口,并不一定看起来就是被挡住的。
      

  5.   

    窗口<>窗体GetActiveWindow() 获取的是当前有焦点的窗口句柄,可能是你自己窗体内部的 Textbox、CommandBotton 等控件的句柄。
    焦点在窗体内并不等于焦点直接等于窗体的窗口句柄,要用 IsChild(Me.hWnd, GetActiveWindow()) 判断。
      

  6.   

        谢谢Tiger_Zhao!但是我还是无法实现我要的那种功能。我原来把窗体设为总在最前,可是这样的话它会挡住其他同一程序的其他任何一个窗口,特别是把警告框也挡在后面了。
         千千静听也没用总是最前,但是它能实现我要的那种效果。
         不知道是不是我的代码中有不当之处,还是运用API不当。     大侠来救救我!被问题困扰着,好痛苦,总似有个心结。若能提供完整的思路并代码最好
         如果你有类似的源代码,也可,我可以借鉴之。
      

  7.   


       解惑!我原以为GetActiveWindow()只是获取窗体的句柄
      

  8.   

    If IsChild(Me.hWnd, GetActiveWindow())=0 Then
        Me.Show
    Else
        Me.Hide
    End If
      

  9.   

    虽然还未能达到本人要的效果,还是感谢Tiger_Zhao