我没试过,是不是是这样的。
hwnd_top是让一个窗口一直保持顶层,,所谓的Z序应该是窗口的创建顺序。比如顺序创建有3个窗口A,B,C,其中C为hwnd_top,那么即使选中A让起处于激活状态,C仍然在A上面。
hwnd_topmost也是让一个窗口保持在顶层,假如创建有4个窗口A,B,C,D,AB为非顶层,CD为顶层,那么即使选种AB任何一个处于激活状态,C或D还是在顶层;但当C或D其中一个处于选中激活状态,都会处于另外三个之上,这也就是说明了,为什么QQ选择hwnd_topmost;假如你开了2个QQ,那么那个选择了就处于那个之上,但两个QQ都处于其他的窗口之上。
至于hwnd_top跟hwnd_topmost,你可以试下那个在上面。

解决方案 »

  1.   

    HWND_TOP是窗口队列的置顶,不过其实就是置于父窗口顶部,所以你不指定父窗口有时候是无效的。
    而HWND_TOPMOST是所有窗口置顶,不管有没有父窗口,它都是跑到最顶层。
      

  2.   

    z序按位置有3类,一类是pop-up, 一类是子控件,另一类是类似QQ那种,顶到最前面。默认的窗口都是pop-up 或者 overlapped风格的,它们在z序的顶层, 他们的父窗口是 桌面。是第一类。还有一类窗口,是通过代码 将窗口顶到 z序的最前端,通过hwnd_topmost顶上去的。这是第3类。以上是我的知识积累得到的结论。
    我们看 百度对setwindowpos中的hwnd_topmost的解释,还有msdn的解释,都解释hwnd_topmost为:"在非顶层窗口",这里所说的非顶层 容易误解人。 比如,子控件,如按钮等也是属于非顶层。用定时器hwnd_top 试试,看 普通窗口会不会顶到最前面去, 结果大吃一惊,发现窗口是会顶到最前面。但是在某些情况下,依然无法顶到最前面。 至于原因,我不清楚。但是定时器hwnd_topmost,就一定可以顶到最前面。总结:hwnd_top似乎不是对应着我说的第1类。
    hwnd_topmost似乎是对应着我说的第3类
      

  3.   

    http://blogs.msdn.com/b/oldnewthing/archive/2005/11/21/495246.aspx
    这里有个参考.先不管父子窗口问题. 只说兄弟窗口先要说说Z-ORDER, 即是一个窗口队列, 标识了了窗口层叠关系.
    在这个z-order中TOPMOST窗口始终是在非TOPMOST窗口的上面, 这涉及到排序规则.
    因为有TOPMOST属性, 就可以把窗口分为两类, TOPMOST和 非TOPMOST.现在就好解释了.
    HWND_TOPMOST就是把窗口设置成最顶层窗口, 相当于直接把窗口放到队列的最前面.
    HWND_TOP就要分两种情况了, 
     1. 如果窗口本身是 非TOPMOST 的, 则窗口被提到所有 非TOPMOST 窗口的最前面, 但仍然在所以TOPMOST窗口的后面.
     2. 如果窗口本身是TOPMOST, 这时效果跟HWND_TOPMOST相同.所以说: 
     "类似QQ 的顶层窗口,据说是定时器不断的hwnd_topmost,而非hwnd_top"
    因为一次HWND_TOPMOST就可以实现, 为什么还要去HWND_TOP呢. 并且QQ还有可能被其它程序强行改成非TOPMOST的情况, 所以直接HWND_TOPMOST是最好的方法了.
      

  4.   


    大牛2个小问题1.TOPMOST属性 请问 这是什么属性,比如对话框,或者一个Cmainframe,我如何设置?是靠setwindowpos还是说创建窗口的时候,指定属性,这个我真不知道。2.因为一次HWND_TOPMOST 一次是不可能搞定的, 其他全屏程序也可以hwnd_topmost的,依然会挡住你的窗口
      

  5.   

    1. 是靠setwindowpos设置.
    2. 所以说QQ那些需要定时的设置HWND_TOPMOST, 这样就能定时保证其在z-order的最前方式, 这个z-order是指所有有TOPMOST属性的窗口的z-order.
    这个问题我已经在#6里说过, 就是你设置了TOPMOST, 其它窗口又设置了TOPMOST,就被"抢"了"沙发", 你只有重新再"插队"抢回来.BOOL SetWindowPos( 
      HWND hWnd, 
      HWND hWndInsertAfter, 
      int X, 
      int Y, 
      int cx, 
      int cy, 
      UINT uFlags 
    ); 
    你仔细看第二个参数的意思, 是指插入到哪个窗口的后面, HWND_TOPMOST就是指最上面了.
    HWND_TOP就是指非TOPMOST的最上面.
    HWND_xxxx都是代表一个插入位置.
      

  6.   

    多谢了啊,还有谁了解,pop-up与hwnd_top的关系,pop-up 一类的窗口,是否都是hwnd_top呢?
      

  7.   


    pop_up也是窗口, 原理是一样的撒.如果是某个窗口中弹出的pop_up就会在这个窗口的上面.
    如果是一个pop_up独立窗口, 那弹出来如果激活即会抢占HWND_TOP. 
    其实这些情况, 你都可以自己写代码来实验的, 别人说的都不一定完全正确, 代码与结果才是真实的反应.  "实践才是检验真理的唯一标准"
      

  8.   

    简单来说hwnd_top只是一次生效,即设置完成后在桌面最上端,这是如果有其他窗口激活则其他窗口会覆盖掉被设置窗口上面,而hwnd_topmost设置完成后会始终在最上端,即便有其他窗口后来被激活仍在拥有hwnd_topmost属性的窗口下面