代码之家  ›  专栏  ›  技术社区  ›  Corey Ogburn

什么线程处理.NET中的模式对话框窗口?

  •  2
  • Corey Ogburn  · 技术社区  · 15 年前

    我对GUI线程和消息循环有一个非常基本的了解,但是我很好奇这如何应用于启动模式窗口的一个窗口。如果我不得不猜测的话,我会说两个窗口都在同一个GUI线程下运行,并且一些参数表示只执行具有子窗口(模式窗口)的事件,否则会向用户指出模式窗口。

    这只是一个半知半解的猜测,我承认我可能错了。我甚至不确定“gui线程”是否是该线程的正确名称,但人们通常可以猜到我在说什么。

    所以简而言之,线程和模式窗口是如何结合在一起的?

    4 回复  |  直到 10 年前
        1
  •  4
  •   Abel    15 年前

    这可能是矛盾的,但不,没有新的线程为新窗口启动。但是,一个新的消息循环被打开。这样可以保持消息在窗口中流动,并避免停止其他应用程序。

    消息将到达,并可能被发送到所有者窗口的消息循环。在所有者窗口上,键盘和鼠标输入已被禁用,但所有其他消息都将通过发送。 HansPassant注意:实际上,同一线程的所有顶级窗口都将以这种方式禁用。

    作为你在问题中已经提到的一个例子, WM_PAINT 发送到父窗口。而且 WM_TIMER 例如。像这样的信息 WM_NCHITTEST 不会通过发送,因为它是一个输入消息。也不会 WM_KEYDOWN 类似的。

    通过这种方式,可以移动一个消息框,并且底层的所有者可以被整齐地重新绘制,或者滴答滴答的时钟仍然在滴答滴答。

    部分信息来自 Rector and Newcomer's Win32 Programming ,第752页,旧的,但仍然有价值和有效的信息。此信息适用于 DialogBox , DialogBoxParam , DialogBoxIndirect DialogBoxIndirectParam 以及 ..Ex 版本。在内部,这些win32 api函数由winforms调用。

        2
  •  4
  •   Community Mohan Dere    9 年前

    两个窗口保持在同一线程上。该线程——GUI线程——继续处理两个窗口的消息。

    模态对话的特殊之处在于:

    • 对话框的所有者设置为主窗口。这会使对话框始终显示在主窗口的顶部。 It's possible to do this with modeless windows.

    • 当对话框打开时,所有者窗口停止接收用户输入(鼠标和键盘消息)。对话框正常接收用户输入。这是通过禁用所有者窗口来实现的,与禁用对话框上的控件的方式相同。

        3
  •  0
  •   Richard    15 年前

    窗口,或者更确切地说是窗口的消息,由创建窗口的线程处理:调用 CreateWindowEx . 这可能是间接的,在应用程序代码和 建立窗口 API调用,但在创建新窗口时调用将始终存在。

        4
  •  0
  •   geniuss99    10 年前

    模式对话框
    https://msdn.microsoft.com/en-us/library/windows/desktop/ms644994(v=vs.85).aspx

    要处理模式对话框的消息,系统将启动自己的消息循环,对整个应用程序的消息队列进行临时控制。当系统检索到一条不明确用于对话框的消息时,它会将该消息发送到相应的窗口。如果它检索到 WM_QUIT 消息,它将消息发送回应用程序消息队列,以便应用程序的主消息循环最终能够检索消息。