PeekMessage 没有收到任何消息
PeekMessage don't get any message
我正在尝试在 C++/CLI 库中为 .NET Windows Form 应用程序创建渲染循环,但 PeekMessage 从未收到任何消息。所以我的渲染循环是无限的,表格看起来是冻结的。
我尝试了几种方法,但这是我最后一次尝试。
开始渲染循环:
Application::Idle += gcnew EventHandler(this, &TECore::AppIdleHandler);
处理它的代码:
void TECore::AppIdleHandler(Object^ object, EventArgs^ e)
{
while (IsAppIdle())
RenderLoopCallBack();
}
bool TECore::IsAppIdle()
{
LPMSG msg = {};
return !PeekMessage(msg, (HWND)_targetForm->Handle.ToInt32(), 0, 0, 0);
}
因此,如果我没有做错任何事情,我会不断检查来自 windows 句柄的消息(也尝试使用 NULL),否则我会渲染内容。但是 window 被冻结了,因为我从未收到任何消息,IsAppIdle 始终 return 为真。我无法聚焦 windows、调整它的大小或其他任何东西..
非常感谢您的帮助。
编辑 1:
如果我在每一帧中执行 Application::DoEvent() ,它就会工作。但是性能缺点是什么?
编辑 2:
我现在很确定我的 PeekMessage 没有收到任何消息,因为 RenderLoop 在 class 库中,而不是直接在 WindowForm 中。 PeekMessage 直接在表单代码中工作正常。这是正常行为吗?也许 C# 在加载 CLI 程序集时会自动将其加载到另一个线程上?所以我的 PeekMessage 正在寻找错误的线程?
我发现了我的问题...只是一个语法错误。 Intellisense 要求将 LPMSG 作为 PeekMessage 的第一个参数(以前从未使用过),事实上我需要传递一个 MSG 指针。所以 PeekMessage 可能是默默地失败了...
使用正确的语法它工作正常。
语法错误
bool TECore::IsAppIdle()
{
LPMSG msg = {};
return !PeekMessage(msg, NULL, 0, 0, 0);
}
正确的语法
bool TECore::IsAppIdle()
{
MSG msg = {};
return !PeekMessage(&msg, NULL, 0, 0, 0);
}
我正在尝试在 C++/CLI 库中为 .NET Windows Form 应用程序创建渲染循环,但 PeekMessage 从未收到任何消息。所以我的渲染循环是无限的,表格看起来是冻结的。
我尝试了几种方法,但这是我最后一次尝试。
开始渲染循环:
Application::Idle += gcnew EventHandler(this, &TECore::AppIdleHandler);
处理它的代码:
void TECore::AppIdleHandler(Object^ object, EventArgs^ e)
{
while (IsAppIdle())
RenderLoopCallBack();
}
bool TECore::IsAppIdle()
{
LPMSG msg = {};
return !PeekMessage(msg, (HWND)_targetForm->Handle.ToInt32(), 0, 0, 0);
}
因此,如果我没有做错任何事情,我会不断检查来自 windows 句柄的消息(也尝试使用 NULL),否则我会渲染内容。但是 window 被冻结了,因为我从未收到任何消息,IsAppIdle 始终 return 为真。我无法聚焦 windows、调整它的大小或其他任何东西..
非常感谢您的帮助。
编辑 1: 如果我在每一帧中执行 Application::DoEvent() ,它就会工作。但是性能缺点是什么?
编辑 2:
我现在很确定我的 PeekMessage 没有收到任何消息,因为 RenderLoop 在 class 库中,而不是直接在 WindowForm 中。 PeekMessage 直接在表单代码中工作正常。这是正常行为吗?也许 C# 在加载 CLI 程序集时会自动将其加载到另一个线程上?所以我的 PeekMessage 正在寻找错误的线程?
我发现了我的问题...只是一个语法错误。 Intellisense 要求将 LPMSG 作为 PeekMessage 的第一个参数(以前从未使用过),事实上我需要传递一个 MSG 指针。所以 PeekMessage 可能是默默地失败了...
使用正确的语法它工作正常。
语法错误
bool TECore::IsAppIdle()
{
LPMSG msg = {};
return !PeekMessage(msg, NULL, 0, 0, 0);
}
正确的语法
bool TECore::IsAppIdle()
{
MSG msg = {};
return !PeekMessage(&msg, NULL, 0, 0, 0);
}