问题标签 [getmessage]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
4056 浏览

c++ - 防止 C 预处理器执行特定的宏替换

如何告诉预处理器不要替换特定的宏?

具体问题如下: Windows 头文件定义 GetMessage 宏。

我的 API 的 C++ 头文件有一个 GetMessage 方法。我不想重命名我的方法。但是在 Windows 上使用 API 时,包括 windows.h 将我的 GetMessage 方法调用替换为 GetMessageA。

0 投票
3 回答
3835 浏览

delphi - 线程没有收到消息

我的 Delphi 应用程序中有一个线程,它有一个消息等待循环。每次收到消息时,它都会开始做一些工作。这是该线程的执行过程:

使用我的应用程序进行一些测试时,我发现 GetMessage 函数依赖于主线程。我的意思是,当主线程正在做一些工作时,我线程中的 GetMessage 函数不会返回,即使一条消息正在等待它接收(消息是由另一个线程使用 PostThreadMessage 函数发送的: PostMessage( MyThreadId, WM_MyMessage, 0, 0))。

只有当主线程完成其工作或调用 Application.ProcessMessages 方法时,GetMessage 才会返回并且我的线程开始工作。实现这种线程间通信我确信我的线程会独立工作,而且我永远不会期望直接发送到线程的消息的接收将依赖于主线程。

在进行测试时,我在主线程中使用了 WaitForSingleObject 函数,等待事件几秒钟。这是当我注意到我的线程没有做任何工作时,即使消息是由另一个线程发送给它的。当 WaitForSingleObject 函数终于完成等待并且主线程变得空闲时,我线程中的 GetMessage 函数返回了。

有人可以解释一下为什么它会这样工作吗?有解决方法吗?我想让我的线程独立接收消息。我所有的线程都是由主线程创建的。这可能是原因吗?

提前感谢您的帮助。

马吕斯。


Mghie,你又完全正确(你最近帮我处理了消息传递的问题,你可能还记得)。正如您所建议的, GetMessage 立即返回,但实际上,线程在调用主窗口方法时挂起:

FOnCommEventMethod 是一个对象的方法,声明为'procedure (EventMask: Cardinal) of object;' (此线程处理串行端口事件)。在这种情况下,FOnCommEventMethod 被分配了一个属于主窗体类的过程。当我的线程调用该方法时,线程挂起等待主线程完成其工作。

怎么会?如您所见,我不使用 Synchronize() 方法来调用此过程。因此,我不希望我的线程与主线程同步。它是否隐含地发生?顺便说一句,我知道除主线程之外的任何其他线程都不应访问任何 GUI 组件,因此应使用 Synchronize 方法,但我现在只做一些快速测试。

回到 WaitForSingleObject 主题,我知道我不应该使用它,但这只是一个测试(巧合地)我注意到了这个问题。

谢谢你的帮助。如果您不帮助我,我可能会摆脱消息传递并改用事件,最后我会注意到这不是原因:-)。

0 投票
3 回答
5389 浏览

delphi - 为什么在 getmessage 之前 peekmessage?

为什么在 Getmessage() 之前需要 peekMessage 语句来创建消息队列?

0 投票
4 回答
2889 浏览

.net - 为什么 GetMessageW 会在我的 WPF 应用程序中占用大量 CPU 使用率?

我手上有一个严重的挠头。我正在调查我们应用程序中 WPF 组件的性能问题。

我们的 .net 应用程序非常大,而且几乎完全采用 Windows 形式。作为一项新计划的一部分,我们使用丰富的 WPF ui 重写了我们的核心组件之一。有很多 WinForms<-->WPF 互操作与这个东西粘合在一起,我怀疑这可能与我所看到的有关。

当我在 ANTS 分析器中分析缓慢的操作时,我看到函数 UnsafeNativeMethods.IntGetMessageW 内部发生了很多活动。ANTS 报告的 CPU 活动与我们所有的业务逻辑和 wpf 渲染内容的组合一样多。该函数没有使用循环的托管代码下线,因此无论 IntGetMessageW 正在做什么,这就是我所追求的。

我不是特别精通 win32 编程,但我知道在这种情况下消息循环的基础知识。不过,我在这里看到的都不是我们手动执行的任何操作——在我们的代码中,我们没有直接与底层消息循环本身进行交互,也没有与任何可以在 WPF 调度程序上访问的更复杂的东西进行交互。

我们这里讨论的 WPF 组件是继承自 Window 编写的(即,它不仅仅是一个控件/用户控件),我们使用 ShowDialog 来展示它,该逻辑是在我们用于在该组件的旧 WinForms 版本上调用 ShowDialog 的更高级别逻辑之外的。我们在 WPF 组件内部使用了一些 WindowsFormsIntegrationHost 控件,以保持与我们现有的一些无法在 WPF 中重写的部分的兼容性。

我已经研究了好几天了,但从来没有发现很多事情要做。我一直在寻找有关输入消息(鼠标和键盘)的模糊相关帖子,但我不知道我能做些什么来验证这一点;我已经尝试过删除代码以删除我可以进行的所有鼠标/键盘操作。

我很难到达任何地方,主要是因为这行代码是完全隔离的(不是我可以指出实际上来自我们的代码的任何东西的父或子),并且对于它正在做什么完全不透明。

这是 ShowDialog 函数的 ANTS 调用图的图像,显​​示了到达此处的调用路径: 替代文字

我完全意识到这可能只是作为 WPF 的一部分必须完成的事情(尽管我们在 WPF 中编写的其他组件不会显示这种行为),或者这只是 ANTS 探查器中的一个非常奇怪的错误,但在这一点我需要以一种或另一种方式验证它。如果有人能告诉我这里正在发生或可能发生的事情——或者给我指出一些我自己能够弄清楚的方法,我会按照你的方式引导各种善业。

更新:针对下面的一些讨论,这是 ANTS 的另一种观点——这个观点更好地说明了我的困惑(这是“CPU 时间”模式下的 ANTS 视图)。我匆忙审查了我们的部分代码,但没有一个与系统相关的功能:

替代文字

感谢您的关注!

0 投票
1 回答
3721 浏览

windbg - 来自 GetMessageW 或 NtUserGetMessage 的消息文本

我有一个作为后台进程生成的进程,由于某种原因,它似乎在后台抛出了一个消息框。所以进程挂起,我无法收到消息。

谁能告诉我如何通过 WinDbg 或任何其他方式获取此消息中的文本?这是 Windows Server 2008 x64 上的 x64 本机 c++ 进程。

“挂起”线程 (0) 上的堆栈顶部是:

谢谢!

0 投票
1 回答
1278 浏览

c++ - Win32 API GetMessage()

我想更改组合框(c++、win32 api)的默认行为。当在其编辑控件中输入某些内容时,我使组合框下拉 我想避免组合框在列表中搜索第一个匹配项、选择它并将所选字符串输入到编辑控件中的默认行为。我可以通过使用 GetMessage() 自己从消息队列中捕获相应的(LB_SETCURSEL 等)消息来抑制这种行为吗?

有没有人对如何做有不同的想法?

问候米贝克

0 投票
2 回答
946 浏览

java - 从 SunAwtCanvas 获取纯文本

由于不可能通过使用标准的 Windows API 函数(GetMessage()drawText()有谁知道如何解决这个问题?也可以接受用 java 编写的解决方案。任何建议都会很好,谢谢。

编辑:是否可以窃取外国画布句柄并将其设置为我自己的画布?所以外国应用程序不会再画到它的画布上,而是画到我的欺骗画布上。通过这种方式,我可以在我的应用程序中轻松地覆盖该drawText()方法。

0 投票
1 回答
419 浏览

filter - 从 DirectShow 过滤器 FillBuffer() 调用中调用 PeekMessage/GetMessage 是否安全?

我有一个使用 DSPACK 组件库用 Delphi 6 编写的 DirectShow 过滤器。它是一个推送源视频过滤器,它从我也编写的外部合作进程接收其源帧。

当创建并运行调用我的过滤器的 FillBuffer() 调用的工作线程时,当图形启动时,我从该工作线程做的第一件事是使用 AllocateHWND() 创建一个隐藏窗口来处理包含外部的 WM_COPYDATA 消息生成的帧。就在线程被销毁之前,我销毁了隐藏的窗口。换句话说,隐藏窗口是在调用 FillBuffer() 的工作线程的执行上下文中创建和销毁的。我的意图是让 FillBuffer() 在等待 WM_COPYDATA 或 WM_QUIT 消息时阻塞。外部合作进程将使用 WM_COPYDATA 消息和隐藏窗口的 WndProcc() 的句柄将帧提交给我的过滤器。我将在我对 pin 的 Inactive() 方法的覆盖中发布一条 WM_QUIT 消息(感谢@RomanR 的提示),

我的问题是,在这种情况下,从 FillBuffer() 调用中调用 PeekMessage() 或 GetMessage() 是否安全?或者,在 DirectShow 图形执行的上下文中是否存在由此发生的潜在缺陷?另外,您是否看到我需要考虑的整体方法中的任何缺陷?

0 投票
2 回答
839 浏览

winapi - GetMessage() 循环后窗口句柄无效

出于某种原因,我在 GetMessage() 循环结束后直接收到“无效的窗口句柄”错误,但我什至没有将 HWND 传递给它,所以我怎么会得到这个错误?:秒

ShowError 没有任何问题,因为我在这个应用程序之外使用它并且没有收到此错误...

0 投票
1 回答
240 浏览

winapi - LIFO Win32 消息循环?

是否有可能巧妙地使用PostMessage,GetMessage等来排队LIFO消息(假设发送者和接收消息循环都合作),还是我需要推出自己的解决方案?

如果您想知道用例,那就是图标加载。您总是希望首先加载最近请求的图标。:)