问题标签 [peekmessage]

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 投票
1 回答
2015 浏览

c++ - 结合 GetMessage 和 PeekMessage

我打算创建一个带有 2 个窗口的小应用程序,一个带有控件的普通窗口和一个 3D 窗口,用 DirectX 渲染。推荐用于 3D 窗口PeekMessage(),因为它在检查消息后不会等待,但对于普通窗口(无 3D 渲染),该GetMessage()函数用于避免处理器无意义的过度使用。因此,当 3D 窗口处于活动状态(WM_ACTIVE收到消息)时,我想使用PeekMessage(),而当普通窗口处于活动状态时,我想使用GetMessage()

主循环如下所示:

在这些窗口的消息处理程序中,我有WM_ACTIVATE消息:

我对 TaskManager 的期望是在 3D 窗口处于活动状态时显示应用程序繁忙(大约 50% 的处理器使用),而在正常窗口处于活动状态时显示应用程序繁忙(大约 5% 的处理器使用)。当两个窗口都失去焦点时,我只看到 50% 的处理器使用率,但当它们中的任何一个处于活动状态时,我看到 0-5% 的处理器使用率。我相信应该有区别,所以我不确定这是否真的有效(甚至可能)。3D 窗口被渲染,普通窗口也响应事件,但处理器的使用让我感到困惑。我只是不希望这影响 3D 窗口的 F​​PS。

0 投票
2 回答
548 浏览

delphi - How to mix Sockets, Messages and Events

There is a thread that uses ADO Connection object, operates with a socket(s) and reacts on outer events using WaitForSigleObject or WaitforMultipleObjects. The thread has an endles loop with 3 actions:

Almost all time the thread wastes CPU asking about all three types of events. Is there way to make thread to sleep until one of three types of events happend, like WaitForMultiplyObjects or GetMessage?

0 投票
2 回答
4358 浏览

c# - WinApi - PeekMessage 总是返回 False

我无法让 PeekMessage 工作。实际上,我希望它会向我发送消息,但它的返回值为 0。

我使用 WinForm,启动一个正在查看消息的后台线程并使用鼠标使用该窗口。该窗口像往常一样可用,但无法查看任何消息。我究竟做错了什么 ?最后一个错误始终为 0。

解决了:

  • 我在主线程中调用Show()以显示我的表单
  • 并重定向主线程以记录消息
  • (不是 XY 问题,我需要 PeekMessage 才能工作或至少了解如何使用它)

(感谢您向我展示我犯的错误)

0 投票
2 回答
543 浏览

c# - 代码优化导致使用PeekMessage时空引用异常

我正在使用这个 gamedev.stackexchange 线程中讨论的游戏循环: https ://gamedev.stackexchange.com/questions/67651/what-is-the-standard-c-windows-forms-game-loop

如果我使用 Debug 构建类型,一切都很好,但是当我去做 Release 时,我得到一个空引用异常。看起来只有当我启用代码优化时才会发生这种情况。这是一个做同样事情的准系统示例。表单是完全空白的,在这个例子中没有按钮/控件。

当我运行它时,据说异常发生在 forms.dll 内的外部代码中,它是在启动此表单的 Application.Run("etc") 之后抛出的。堆栈跟踪并没有真正的帮助,它只是 Application.Run 和一堆外部代码。

我不确定是什么原因造成的,但我知道这与调用 PeekMessage 有关,因为如果我注释掉对 Idle 事件的订阅,则不会发生错误。

作为一个附带问题,为什么我需要在这里声明“NativeMessage”结构?如果我剪掉它似乎不会引起问题,但是使用此游戏循环的每个示例都包含它。

0 投票
1 回答
5500 浏览

c++ - PostThreadMessage 不起作用

我有一个事件处理线程类,它允许我从其他线程引发事件而不会中断它们的操作。当调用析构函数时,我向线程发送退出消息,但它的消息循环似乎没有收到此消息。

GetMessage当我发送退出消息时不返回。并GetLastError()PostThreadMessage通话后使用 1444 ERROR_INVALID_THREAD_ID

我不想使用PeekMessage,因为它使用 100% CPU,也不Sleep是因为这显然是不好的做法

谢谢

0 投票
1 回答
1091 浏览

c# - 无限超时查看 MSMQ 消息


我正在编写一个从 Microsoft 消息队列 (MSMQ) 中窥视消息的应用程序。我希望我的应用程序依次查看 MSMQ 消息(从第一条消息到最后一条消息)。在完全窥视完最后一条消息后,主线程将被阻塞,直到 MSMQ 有新消息到达。
我写了一些代码,但有一个例外,解释如下:

}


谁能帮我解决这个问题。谢谢!

0 投票
1 回答
1733 浏览

c# - 无限超时查看 MSMQ 消息

我正在编写一个从 Microsoft 消息队列 (MSMQ) 中窥视消息的应用程序。我希望我的应用程序依次查看 MSMQ 消息(从第一条消息到最后一条消息)。在完全窥视完最后一条消息后,主线程将被阻塞,直到 MSMQ 有新消息到达。
我已经使用了带有TimeSpan=MessageQueue.InfiniteTimeout的MessageQueue.Peek(TimeSpan, Cursor, PeekAction) 方法并且有一个问题:MessageQueue.InfiniteTimeout 值大约为 49 天,但我希望我的应用程序等待新消息的时间非常长(大约 1000 天),我已经切换 TimeSpan = TimeSpan.MaxValue 但没有成功。你能给我一些解决方案或建议吗?谢谢! 我的代码是这样的:

0 投票
2 回答
3093 浏览

rabbitmq - IBM MQ 中的消息查看

在 MSMQ 中,有一个功能可以让用户在不实际使用的情况下查看消息。即,我根据 MessageID 查看队列中的下一条消息。如果我对消息不感兴趣,我可以将消息放回队列(即将未确认的消息添加回队列并保留 messageID)。

RabbitMQ 中也存在类似的功能。然而,在 RabbitMQ 中,它并没有以干净的方式完成。您可以通过将消息从队列中取出然后不发送确认来模拟查看消息,这样 RabbitMQ 就会将该消息添加回队列。但是我读到当未确认的消息重新添加到队列中时,RabbitMQ 可以重新排序消息并增加消息 ID。

有没有人遇到过这个问题。

还有人知道 IBM MQ 是否支持这种偷看和搜索的行为/功能吗?

问候 D

0 投票
2 回答
160 浏览

c++ - 通过 CreateProcess 启动应用程序但似乎无法 PeekMessage?

我有一个简单的(Windows)应用程序,它使用 CreateProcess 函数启动另一个应用程序。然后它通过使用 EnumWindows 和新创建进程的进程 id 获得正确的 hwnd。

获得 hwnd 后,我的应用程序的“主循环”就开始了。这个循环一直持续到由 CreateProcess 启动的应用程序不再运行。

一切正常,直到我尝试使用 PeekMessage 查看发送到我启动的应用程序的消息 - 我的应用程序似乎根本没有识别任何消息,但是启动的程序(通过 CreateProcess)正在运行像往常一样,做应该做的一切..

我想要实现的是从发送到应用程序中删除某些消息,主要是各种 F 键(F1、F2..F12 键),但如果可能的话,我想更改显示在应用程序(我不知道菜单的技术名称,我的意思是,它是您点击右上角的应用程序图标看到的那个) - 我想添加一个小的“关于”选项。

如果有人能指出我在我的代码中做错了什么,或者更好的替代方法来阻止某些按键到达启动的应用程序,我将非常感激。

提前谢谢了。:)

这是我目前拥有的代码:

0 投票
1 回答
47 浏览

windows - 如何在 WindowProc 中取消 LongyOperation

我读过一篇 MSDN 文章并完全困惑:

MSDN 说使用此代码,我们可以在长时间操作期间检查消息队列并在鼠标单击或键盘按键按下的情况下取消它。这是怎么回事?

当 DoLengthyOperation 开始时直到它完成才会返回,并且 PeekMessage 不会在这个时候调用并且不能取消操作。

msdn 链接:https ://msdn.microsoft.com/en-us/library/windows/desktop/ms644928