我程序中有主窗体 form1和子窗体form2,form2以form2.show显示
主窗体中点击按钮先启动一个 ttimer,然后application.messagebox('hello','title',mb_iconinformation)显示一个modal的消息框,这是ttimer计时器到达,在ontimer中执行form2.bringtofront,将form2提前,从而盖住了modal消息框,使得鼠标无法操作窗口了。如果 alt+tab切换一下窗口,可以吧modal消息框提前到上面显示,这样可以关闭modal消息框了。请问如何在代码里使modal消息框不被覆盖住,就是保持modal消息框Zorder位于最上面?

解决方案 »

  1.   

    楼主提问方式不错,几句话把环境叙述得很清楚。我想,你的难处是无法像自定义窗口那样直接操纵 MessageBox 窗口。不妨在 MessasgeBox 刚显示后用 GetForegroundWindow 取出其 handle,然后就可以借助此 handle 任意操纵这个窗口了。要是感觉这种方法不可靠,不妨自己做一个 form 取代 MessageBox。那样你就可以任意处置了。
      

  2.   

    不知道alt+tab调用了什么机制,如果能调用一个方法把窗口重新排列一下就好了,这样modal消息框就可以置顶显示了
      

  3.   

    messagebox的最后一个参数or MB_SYSTEMMODAL 或 or MB_TOPMOST
    举例:
    windows.MessageBox(0, '顶层窗口', '顶层窗口', MB_ICONINFORMATION or MB_SYSTEMMODAL);详见MSDN
      

  4.   

    如果不用楼上的方法,能否利用alt+tab的消息处理来 恢复窗口上下覆盖的关系。
      

  5.   


    你的代码中messagebox和form2没有一毛钱关系, 更谈不上窗体顺序
    要么你的messagebox置顶
    要么你的messagebox在form2中创建
      

  6.   

    可是程序里有千千万万个MessageBox了,如何更新,何况明明通过一个简单的alt+tab切换就可以解决的问题,只要知道方法,可以小改动一下就解决的问题啊
      

  7.   


    你主窗口同时调用两个窗口show了, 然后再弹出messagebox, 那么这三个窗口就一定有先后次序关系吗?你的问题原因很简单,不涉及复杂逻辑, 修改替换也相对安全, 该改就改, 没什么投机取巧的方法
      

  8.   

    找到方法了,form2.bringtofront后添加一句,SetForegroundWindow( application.handle )激活应用程序就可以了。如何啊!!!
      

  9.   

    不错,如果这样呢:SendMessage(Application.Handle,WM_ACTIVE,0,0);?