当前位置: 首页 > 知识库问答 >
问题:

在win32程序中调用DispatchMessage是否必要?

须敏学
2023-03-14

Win32程序通常有一个消息循环,循环调用GetMessage或PeekMessage,然后调用DispatchMessage将消息分派到相关窗口的窗口进程。

但是,真的有必要这样做吗?我是否可以直接在消息循环中查看 MSG 对象,并在其中执行所需的操作,而无需调用 DispatchMessage?我说的是我有一个窗口没有其他窗口控件的情况,例如,如果该窗口仅用作direct3d显示窗口,则消息将始终指向唯一的窗口。

大多数情况下,我只是好奇,但它也可能导致我的代码的某些方面也更干净。

共有1个答案

楚望
2023-03-14

您调用< code>DispatchMessage将消息传递到适当的窗口,传递到它的“窗口进程”。你认为你只有一个窗口,但它真的是唯一的吗?< code>COM将创建助手窗口,其他子系统也可能创建助手隐藏窗口,助手隐藏窗口将传递发布到共享消息队列并寻址到这些窗口的消息。不需要考虑太多这些细节,你就可以用API来调度它们。您必须这样做,因为这些子系统依赖于消息泵的存在。

间谍 Windows SDK工具可以帮助您查看您真正拥有的窗口数量。

尽管如此,如果您确实拥有唯一的窗口,那么无论您的处理程序是从DispatchMessage内部调用,还是直接由您的消息泵调用,都没有太大的区别。

 类似资料:
  • 问题内容: 最近,我将Swing应用程序转换为Webstart。这个过程非常简单,但是我发现在关闭所有窗口之后,应用程序的JVM没有终止。线程转储显示有两个非守护进程线程,特别是Swing的EDT,AWT和几个与Websart相关的线程。 实际使用的策略是,每个窗口在创建时都会增加一个计数器,在关闭时会减少一个。默认关闭操作为DISPOSE_ON_CLOSE。当计数器达到零时,我停止所有线程池并释

  • 问题内容: PS:我确实知道如何正确清理,而无需依赖。 Java是否不能保证在程序退出时会进行正确的垃圾回收? 例如,可以说我将一些数据保留在缓存中,而不是经常对其进行序列化,我还实现了这样一个希望:如果由于某种原因(崩溃除外),我的程序正常退出,那么缓存将被写入数据库/文件/一些- 由我的代码存储在finalize()方法中。但是根据下面的小实验,看来JVM似乎没有“优雅地”清理内存,而是退出了

  • 我在windows Server 2008 R2上运行Apache 2.4.9。 我需要立即禁用SSLv3以防止狮子狗攻击。为此,我打开了文件 然后我向它添加了以下代码行 是否在中检查SSLv3和SSLv2是否被禁用? 以下是我所做的更多方法,以确保我正确地做这件事。我尝试添加这一行而不是其他命令(即) 我甚至尝试在Apache24目录中搜索任何包含单词“SSLProtocol”的文件,如下所示

  • 问题内容: 我正在编写一个GUI前端,在执行一堆验证后将执行一系列已经存在的vbscript .wsf文件。 我的问题是,当我尝试执行.wsf文件时,出现错误 从命令行运行它们工作正常 我尝试了几种不同的选项,如call,os.system等。但是所有这些都导致相同的Win32错误。 有任何想法吗? 问题答案: 如警告所述,不是应用程序。它是通过作为参数传递给脚本引擎而运行的脚本。您可能需要改为调

  • 在Windows 10主页(在x64位)上,我尝试在命令提示符上运行以下命令: 节点索引。js 错误如下: C:\Users\cooldudeasateen\OneDrive\Coding\sil\node\u modules\bindings\bindings。js:121;e^ 错误:\?\C:\Users\cooldudeasateen\OneDrive\Coding\sil\node\u

  • 这是我所拥有的:我们有2个应用程序,一个生产和一个消费。两者都运行在不同的JVM上。它们向持久主题发送消息,并使用相同的ClientId。 我想知道在JMS 2.0规范下是否允许这样做,以及在Artemis中这样做是否可以。 在消费方面,我有一个连接工厂 在实例化ActiveMQConnectionFactoryBean时,我通过以下方法在工厂上设置clientID:<code>。setClien