gpt4 book ai didi

windows - Win32 事件驱动编程是如何在幕后实现的?

转载 作者:可可西里 更新时间:2023-11-01 12:37:30 25 4
gpt4 key购买 nike

在 Win32 C++ 应用程序中,我们启动一个消息循环,从队列中获取消息,翻译它们,然后分派(dispatch)它们。最终,每条消息都会到达我们的 WndProc,在这里可以处理关联的事件。

我理解那部分。我不明白的是这两者之间的关系。具体来说:

  1. 不同类型的 OS 中断处理程序必须将消息放置在上述“消息队列”中,但是这个队列驻留在进程地址空间中的什么位置?它如何暴露给中断处理程序代码?
  2. “翻译”消息是什么意思?调用 TranslateMessage() 的真正作用是什么?
  3. 一旦被 DispatchMessage() 分派(dispatch),消息在到达我的 WndProc 之前经过了哪些地方(即操作系统如何处理它)?

如果有人知道上述问题的答案,请满足我的好奇心。谢谢。

最佳答案

操作系统维护一个消息队列,它将事件(例如,来自中断或其他来源)放在那里。然后,它根据消息将消息从该队列发送到所有窗口(例如,它不会将关键消息发送到没有焦点的窗口)。

应用程序可以有自己的队列来处理消息。这些队列被创建 on request (仅在需要时)。

翻译消息用于创建非“真实”事件的消息。例如,WM_CONTEXTMENU 消息是从鼠标右键单击、上下文菜单键或 shift-F10“翻译”而来的。 WM_CHAR 是从 WM_KEYDOWN 消息转换而来的。当然,许多其他消息也是这样“翻译”的。

一条消息被发布到每个应该接收它的窗口。操作系统根据消息的类型决定窗口是否应该接收该消息。大多数消息由系统等待,即消息在被窗口处理之前不会被发布到另一个窗口。这对广播消息有很大的影响:如果一个窗口在处理该消息时没有返回,队列是blocked。其他窗口将不再收到消息。

关于windows - Win32 事件驱动编程是如何在幕后实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/765421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com