问题标签 [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 投票
5 回答
6141 浏览

windows - 有没有像 PeekMessage 这样不处理消息的函数?

我试图无辜地打电话

在 PeekMessage 调用中,Windows Vista 64 正在处理消息。结果是我要重入我的绘画调用和各种其他代码。

在我们的应用程序中绘制可能需要几秒钟,所以我们添加了 PeekMessage 调用来查看用户是否按下了某个键,这样我们就可以中断该绘制并启动下一个绘制。我们几乎没有意识到 Windows 可以开始处理我们身上的消息。将真正的绘画工作放在一个单独的线程中将是一个重大的重构......我们试图查看是否按下了特定的键,或者是否旋转了鼠标滚轮或单击了鼠标按钮,以中断渲染。

我已经尝试专门添加代码以防止重新进入,然后将绘制消息重新注入队列等。这一切都非常笨拙,并且在某些情况下它不能很好地工作。

我可以在 PeekMessage 调用中添加一些标志吗?我在 MSDN 上的文档中没有看到任何新内容。我真的需要一个PeekMessage不处理消息的。帮助!

0 投票
3 回答
3082 浏览

delphi - delphi 2006中的postthreadmessage和peekmessage问题

我创建了一个多子应用程序。应用程序窗口 (W[n]: TMyWindows) 都是相同的,并且都有一个与之关联的私有对象类实例 (E: TMyObject)。子窗口通过这个对象生成一些消息。我在主应用程序中创建了两个线程,它们根据消息的内容处理这些消息。例如,让我们有以下异步调用:

TMyObject.Service(servicetype) 是

现在,在每个线程的执行方法中,我有类似的东西:

一切都很好,除了第二个线程没有收到任何消息。你知道为什么吗?

0 投票
1 回答
1064 浏览

c++ - PeekMessage() 重置鼠标光标

我目前正忙于在 Windows XP 的 C++ 应用程序等游戏中更改鼠标光标。

要更改我正在使用的光标SetCursor()并传入所需的光标,该光标正在工作。但是,在调用游标的 while 循环期间,PeekMessage()不断重置为默认箭头。

这是有问题的循环:

在调试时,我发现在调用期间光标发生了变化,PeekMessage()之后 msg.message == 0x200,这应该使消息成为以下之一:

我无法找到任何关于为什么会发生这种情况的信息,并且没有使用 Windows 消息的经验。

谢谢。

编辑:

根据此处,每次鼠标移动时系统都会重新绘制类光标,从而有效地将其设置回默认光标。考虑到这一点,我将其添加到窗口消息回调函数中:

问题解决了。

0 投票
2 回答
1401 浏览

c++ - 编译器找不到结构,我应该包括什么

更新:我认为它是 Windsows.hi 需要包含并且您已经确认了这一点,但是当我包含它时,我会收到一堆消息,如下所示......

我不知道如何解决这个问题,哎呀!


我正在尝试调用 PeekMessage,但是当我尝试编译时出现以下错误。

“MSG”:未声明的标识符 “HWND”:未声明的标识符 “PM_REMOVE”:未声明的标识符

我的代码如下...

我知道这些结构是什么,但可以让编译器识别它们。我是否缺少参考或是否有相同的 VC++ 别名?

干杯。

0 投票
3 回答
5389 浏览

delphi - 为什么在 getmessage 之前 peekmessage?

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

0 投票
2 回答
4793 浏览

c++ - PeekMessage 没有收到消息?

我创建了一个自定义消息类型,用于调整我的Window, 称为WM_NEED_RESIZE. 我已经在我的 .h 文件中定义了它,并在我的 .cpp 文件中进行了初始化。我还注册WindowProc了接受消息的功能。以下是这些项目的代码:

在另一个函数中,我正在运行PeekMessage(..)以收集所有消息。这是消息泵的片段:

我的问题是该WM_NEED_RESIZE消息仅在窗口首次打开时在消息队列中找到一次PeekMessage(..),之后我的. 我真的不确定为什么会这样。但是,它WindowProc(..)方法接收(这对我没有帮助)。我将不胜感激你们可以提供的任何帮助。

谢谢

贾勒特

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 投票
0 回答
1254 浏览

c++ - PeekMessage C++ 64 位

我在 WinMain 函数中使用以下代码:

当我使用 32 位 (Win32) 平台编译时,这可以正常工作。在 64 位 (x64) 平台下,代码编译得很好,但是当我运行它时它崩溃了。使用调试器,我发现它在 PeekMessage 行上出现访问冲突错误。这只发生在 64 位,所以我想知道为什么会这样?有什么我做错了,或者我应该知道我做错了什么关于 64 位的事情吗?

我觉得这很奇怪,因为它并不总是在通过该循环的第一步出错,有时是第二次甚至第三次,但它总是在 PeekMessage 行上停止,并具有相同的访问冲突。

请评论是否对我发布更多代码而不只是这部分有帮助(我 99% 确定这是发生错误的地方)。

谢谢!

编辑 这是访问 flash ocx 的类的构造函数....

为 flashDLL 传递的内容是 m_FlashLibHandle,其中

0 投票
1 回答
1836 浏览

winapi - 为什么 PeekMessage 总是返回 TRUE?

“渲染”功能尚未执行

0 投票
0 回答
858 浏览

delphi - Delphi PeekMessage 访问冲突 Delphi 2009 Windows API

定期从 PeekMessage 获取访问冲突。这不是我对 PeekMessage 的调用,它来自 Application.Run。MadExcept 的堆栈跟踪显示 Application.Run 调用 PeekMessage,而后者又调用 kiUserCallBackDispatcher。

德尔福 2009。

堆栈跟踪是:

我认为这意味着 PeekMessage() 正在调用我的一个窗口过程来处理消息,但它找不到那个窗口过程。起初我不明白为什么 Peekmessage 会调用任何窗口过程,因为它只是在查看消息,但是从这里和其他地方的进一步阅读中我想我看到了:

  • PeekMessage() 将处理从其他线程发送的 SendMessages()
  • PeekMessage() 有时会处理 Paint 消息
  • 其他人报告说看到 PeekMessage 为其他消息调用 Window 过程,例如 WM_ERASEBKGND。

来自 MSDN:

在此调用期间,系统会传递待处理的非排队消息,即使用SendMessageSendMessageCallbackSendMessageTimeoutSendNotifyMessage函数发送到调用线程拥有的窗口的消息。

我不太明白,因为我认为 SendMessage() 调用会立即处理。其他人似乎认为这仅适用于 SendMessage 来自另一个线程时。

我不能在一个独立的项目中复制它。从错误看来,好像 PeekMessage 正在调用一个不再存在的窗口过程 - 但我自己尝试通过故意破坏表单然后对无效窗口句柄执行 SendMessage() 和 Postmessage() 来做到这一点,而 Windows 似乎只是忽略它。我已经尝试将消息从表单的析构函数发送到自身以及其他各种事情,但我不能让它失败。

关于其他要检查的任何建议?提前致谢。

瑞克