- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我打算创建一个带有 2 个窗口的小型应用程序,一个带有控件的普通窗口和一个使用 DirectX 渲染的 3D 窗口。对于 3D 窗口,建议使用 PeekMessage()
,因为它不会在检查消息后等待,但对于普通窗口(无 3D 渲染),GetMessage()
函数用于避免处理器无意义的过度使用。因此,当 3D 窗口处于事件状态时(收到 WM_ACTIVE
消息)我想使用 PeekMessage()
并且当普通窗口处于事件状态时我想使用 GetMessage( )
。
主循环看起来像这样:
NormalWindowActive = false;
Window3DActive = false;
MSG msg;
while (TRUE) {
if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if (NormalWindowActive) {
if (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
} else {
RenderWindow();
}
}
在这些窗口的消息处理程序中,我有 WM_ACTIVATE
消息:
HWND NormalWindow, Window3D; // These windows are global vars
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
// ...
case WM_ACTIVATE:
if (wParam!= WA_INACTIVE) {
if (hWnd == NormalWindow) {
NormalWindowActive = true;
Window3DActive = false;
} else {
Window3DActive = true;
NormalWindowActive = false;
}
}
break;
// ...
}
我对 TaskManager 的期望是在 3D 窗口处于事件状态时显示应用程序繁忙(~50% 的处理器使用),而在正常窗口处于事件状态时(~5% 的处理器使用)不那么忙。当两个窗口都失去焦点时,我只看到 50% 的处理器使用,但当其中任何一个处于事件状态时,我看到 0-5% 的处理器使用。我相信应该有所不同,所以我不确定这是否真的有效(甚至可能)。呈现 3D 窗口并且普通窗口也响应事件,但处理器的使用让我感到困惑。我只是不希望这影响 3D 窗口的 FPS。
最佳答案
您应该检查 3D 窗口是否处于非事件状态,而不是检查普通窗口是否处于事件状态。您还可以使用 WaitMessage
而不是 GetMessage
,因为它可以避免重复代码。
例如:
if (Window3DActive)
RenderWindow();
else
WaitMessage();
您的问题似乎是当普通窗口处于非事件状态时,即使 3D 窗口处于非事件状态,消息循环也不会等待。
如果您决定使用WaitMessage
,您还应该在PeekMessage
上循环,因为队列中可能有不止一条消息和WaitMessage
直到有新消息到达才返回。
关于c++ - 结合 GetMessage 和 PeekMessage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15838059/
我目前正忙于在 Windows XP 的 C++ 应用程序之类的游戏中更改鼠标光标。 要更改光标,我正在使用 SetCursor() 并传入所需的光标,它正在工作。然而,在调用 PeekMessage
我得到了这个错误,我不知道为什么,我只是正确地按照他所做的去做,而他没有得到这个错误。这是代码。 //Main application loop MSG msg = {0};
我创建了一个自定义消息类型,用于调整我的 Window 的大小,称为 WM_NEED_RESIZE。我已经在我的 .h 文件中定义了它,并在我的 .cpp 文件中进行了初始化。我还注册了我的 Wind
我的 C++ 应用程序中有一个(静态)线程,它经常执行某些操作。为了在线程和我的应用程序之间交换信息,我使用方法 PostThreadMessage 和 PeekMessage。 由于某些原因,我不能
我有以下代码 SendApp,点击按钮[X]时,执行以下代码 HWND pHWndReceiveApp = FindWindowA(NULL, "ReceiveApp"); if (NULL
大家好 在我的应用程序中,我使用以下代码: bool HandleMessages() { MSG msg; if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
为什么在Getmessage()之前需要使用peekMessage语句来创建消息队列? 最佳答案 这不是必需的。 不过,您有时会看到一个线程尚未准备好处理消息,但它希望能够在其消息队列中接收消息。新线
我有一个简单的 (windows) 应用程序,它使用 CreateProcess 函数启动另一个应用程序。然后它通过使用 EnumWindows 和新创建进程的进程 ID 获得正确的 hwnd。 在获
我无法让 PeekMessage 工作。实际上,我希望它会向我发送大量消息,但它的返回值为 0。 我使用 WinForm,启动一个正在查看消息的后台线程,然后用鼠标使用窗口。该窗口像往常一样可用,但无
我打算创建一个带有 2 个窗口的小型应用程序,一个带有控件的普通窗口和一个使用 DirectX 渲染的 3D 窗口。对于 3D 窗口,建议使用 PeekMessage(),因为它不会在检查消息后等待,
关于: PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) If hWnd is NULL, PeekMessage retrieves messages for any
昨天我遇到了我见过的最奇怪的问题。我写了一个模块,应该在 USB 插头上收到通知。为此,我创建了一个虚拟窗口并使用某些界面的 GUID 将其注册到设备更改通知。 调用PeekMessage 时出现奇怪
我们的应用程序充当 COM 服务器,其中所有自动化都发生在单个 STA 单元内(在应用程序的主线程中),并且一些进行长时间(> 10 分钟)调用的 VBS 脚本失败并显示错误“系统调用失败(80010
我的代码中某处有一个循环函数,它调用 PeekMessage 以检索事件。 目前看起来是这样的: while (PeekMessage(&Message, NULL, 0, 0, PM_REMOVE)
在 Windows 中,可以在代码中运行事件 .. //PeekMessage loop example while (WM_QUIT != uMsg.message) { while (P
我在这里看了很多关于 PeekMessage 和 WM_MOUSEMOVE 的帖子,但到目前为止我还没有发现任何与性能相关的内容。 长话短说;我正在做 PC 游戏开发,昨天我注意到我可以将我们的应用程
我正在尝试在 Java 代码中接收 WM_HOTKEY 事件。我已经成功地使一些一次性代码正常工作,但我知道将 Java GUI 代码与 Windows 消息循环集成需要谨慎。 从 Windows 示
我是一名优秀的程序员,十分优秀!