【问题标题】:PeekMessage() Resetting the Mouse CursorPeekMessage() 重置鼠标光标
【发布时间】:2009-12-04 01:51:18
【问题描述】:

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

要更改光标,我正在使用SetCursor() 并传入所需的光标,这是有效的。然而,在调用 PeekMessage() 的 while 循环期间,光标不断重置为默认箭头。

这是有问题的循环:

MSG  msg;
while( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
{
    TranslateMessage( &msg );
    DispatchMessage( &msg );
}

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

WM_MOUSEFIRST = 0x200
WM_MOUSEMOVE = 0x200

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

谢谢。

编辑:

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

case WM_SETCURSOR:
    return 0;

问题解决了。

【问题讨论】:

    标签: c++ cursor peekmessage


    【解决方案1】:

    你是如何调试的?除非您使用 SoftIce 或其他不共享 Windows 鼠标指针的应用程序,否则很难将调试器与应用程序隔离开来。

    【讨论】:

    • 我只是使用键盘进行调试。鼠标停留在应用程序窗口上。所以我可以在单步执行代码时观察它何时发生变化。
    • 我认为这不可靠。调试器仍在影响指针。如果您在没有调试的情况下运行应用程序会发生什么?那不行吗?
    • 它仍然会发生。如果我在消息循环之后system( "pause" )the 应用程序,我可以看到光标已更改,因此虽然特定消息可能不正确,但它仍然必须在某处发生。
    • 您是否遵循管理光标形状的规则?请参阅msdn.microsoft.com/en-us/library/ms648393%28VS.85%29.aspx,尤其是将其改回完成后的状态。
    • 嘿,不错的链接。尽管我已经阅读了该页面,但这部分现在很突出:“如果类光标不为 NULL,则每次移动鼠标时系统都会恢复类光标”,这正是发生的事情。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多