MessageBox 这个API相比大家已经熟悉的不能再熟悉了
不过我想知道一下,这个API在第一个参数是NULL的时候,他的运行机制。
::MessageBox(NULL, ...)
这种时候,他是不会阻塞掉当前线程,而且,当前的AP还可以弹出很多个,且每个MsgBox之间都不互相干扰。
有人能帮忙解释一下其中的内部运行机制吗?

解决方案 »

  1.   

    这个API就相当于您自己创建一个对话框。您可以把一个对话框自己封装成这样一个API,然后您就明白啦。
      

  2.   

    hWnd 
    [in] Handle to the owner window of the message box to be created. If this parameter is NULL, the message box has no owner window. 
    这个hwnd,就给出了meessagebox这个类似或者说就是模态对话框的父窗口,对于模态对话框,楼主应该知道什么意思了吧, 其他窗口将不会拥有焦点,若hwnd == NULL,  has no owner window当然就有其他窗口会得到焦点, 这跟domodel(NULL),一样的道理,就是这个,但是不能说他阻塞了其他线程,没这个说法!
      

  3.   

    NULL
    父窗口句柄默认为主界面
      

  4.   

    这个hWnd是设置所有者窗体的(owner window),为NULL的话就没有所有者窗体,那就是说,这个时候的MessageBox就不是模态对话框了。
      

  5.   

    2楼,我能理解你说的这些了
    可是我测试了一下,若我第一个参数传::GetDesktopWindow()
    发现他和传NULL的效果一样(当然这个效果是指我们表面上看上去的效果)
    那这个时候MessageBox是模态还是非模态?模态的话,主窗口就是桌面了吗??
      

  6.   

    补充一点,若传GetDesktopWindow(),那父窗口就是桌面,那这个时候这个窗口所使用到的message loop是谁的?
    我自己的应用程序,还是桌面所属的AP?
    很疑惑这点~
      

  7.   

    GetDesktopWindow()其实就是和传NULL,是一样的,但是即使是传这个,这个messagebox他还是模态的对话框(不会变成非模态的),同样,你也不可能让他最小化, 当你把所有的窗口全部最小化以后(看到桌面了,你在试试,依然是模态的属性),这个时候属于桌面了!
    ps:呵呵, 感觉你这问题是在挖陷阱让我跳,不过重在交流,即使我说的不对,如果最后能证明是不对的,那也挺好!