none
关于窗口和子窗口的问题 RRS feed

  • 问题

  • 关于窗口和子窗口的问题

    条件:
    1 有一主窗口W,属于进程P,运行在自己的线程T上
    2 有另一窗口Wx, 属于进程Px, 运行在自己的进程Tx上
    3 两者首次创建进入消息循环后,都属于同一个desktop上
    4 由第三个窗口M执行了SetParent(GetHwnd(Wx), GetHwnd(W)),这里定义的GetHwnd表示获取其窗口句柄,实现了把Wx设定为W的子窗体,移动W后Wx也一起移动。

    问题:
    Wx上有一个按钮,执行了一个阻塞Sleep操作(例如:50秒),如果Wx不是W的子窗体时,Wx在桌面上变成了ghost类。但是,成为了W的子窗体后,连带W也变成了ghost。为什么?


    是W P T 和 Wx Px Tx 之间的关系引起的吗?

    设计这个实验的原意是:Wx忙的时候,允许其变成ghost,但Wx必须成为W的子窗体,当然,Wx变成ghost之后不能连带W也变成了ghost(也不涉及调用DisableProcessWindowsGhosting的情况),W仍然可以完成自己任务,W下其他的子窗体、控件也可以正常使用。

    • 已编辑 CHEN090614 2009年6月14日 8:40 补充
    2009年6月14日 8:07

答案

  • 父窗口会自动调用子窗口的消息处理函数,子窗口的消息不返回,父窗口会永远等待下去,这时父窗口的消息队列是挂起状态,任何消息操作都被挂起.
    0xBAADF00D
    • 已标记为答案 Tim Li 2009年6月22日 5:37
    2009年6月14日 8:39
    版主

全部回复

  • 父窗口会自动调用子窗口的消息处理函数,子窗口的消息不返回,父窗口会永远等待下去,这时父窗口的消息队列是挂起状态,任何消息操作都被挂起.
    0xBAADF00D
    • 已标记为答案 Tim Li 2009年6月22日 5:37
    2009年6月14日 8:39
    版主
  • 为何桌面可以做到这一点?
    2009年6月14日 8:41
  • 桌面是个特殊的窗口,和其他的窗口根本不一样.
    桌面根本就没有WndProc,可以用Spy++看出来.
    若不阻塞的话,需要加上POPUP风格,用Create,而非DoModal



    0xBAADF00D
    2009年6月14日 10:57
    版主