我试图在C++/CLI库中为.NET Windows应用程序创建一个呈现循环,但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);
}因此,如果我没有做任何错误,我总是检查从我的窗口句柄(也尝试了空)的消息,否则我会渲染的东西。但是窗口被冻结了,因为我从来没有收到任何消息,IsAppIdle总是返回true。我不能聚焦窗户,调整它的大小或任何东西。
非常感谢你的帮助。
编辑1 : --如果我在每个帧中执行Application::DoEvent(),就可以工作了。但是表演的缺点是什么呢?
编辑2 :
我现在非常肯定,我的PeekMessage没有收到任何消息,因为RenderLoop在类库中,而不是直接在WindowForm中。PeekMessage直接在表单代码中工作得很好。这是正常的行为吗?也许C#在加载CLI程序集时会自动地将它加载到另一个线程上?所以我的PeekMessage找错线索了?
发布于 2017-04-01 11:56:12
我发现了我的问题..。只是语法错误。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);
}https://stackoverflow.com/questions/43120618
复制相似问题