什么可以重置光标形状除了SetCursor?

时间:2012-01-26 14:42:23

标签: c++ winapi cursor reset

我维护一个使用flash ocx播放SWF文件的C ++应用程序。

当用户在SWF上的按钮上盘旋时,flash内部调用WinAPI SetCursor函数来设置IDC_HAND光标 - 当我通过{{监视WinAPI调用与游标相关的函数时,我可以看到3}}。但是,在我的情况下,光标不会改变,即保持IDC_ARROW

应用程序本身根本不会调用SetCursor。应用程序窗口处理WM_SETCURSOR消息如下,即不恢复光标:

case WM_SETCURSOR:
    {   
        static bool restoreCursor = false;
        if (LOWORD(lParam) != HTCLIENT)
        {
            restoreCursor = true;
        }

        if (restoreCursor)
        {
            restoreCursor = false;
            // DefWindowProc will set the cursor
            break;
        }
        return 1;
    }

在这种情况下,有谁可以告诉我谁可以重置/更改光标形状?

更新:有趣的是,我有2个类似的设置会产生相反的结果。

我维护的应用程序实际上在“SysListView32”上安装了WH_GETMESSAGE挂钩,并启动了一个创建Flash播放器的线程。所以设置不是那么简单。

但是,如果我只创建一个简单的示例来创建一个基本上是winmain的播放器,那么上面的代码就可以完美地工作并且光标会被更改。

所以在第一种情况下,某些东西确实会重置光标状态。如何找出重置光标的内容

2 个答案:

答案 0 :(得分:1)

你的窗口(父窗口)在覆盖光标时得到一个破解并返回TRUE(1)表示你处理它并停止进一步处理。箭头可能来自您的WNDCLASS注册或来自DefWindowProc。

所以,在我看来,你想要返回FALSE以允许子按钮在实际设置光标时出现裂缝。或者,完全删除处理WM_SETCURSOR。

答案 1 :(得分:0)

好的,这个问题的真正答案是非GUI线程无法直接更改光标。 请参阅页面底部的注释 http://msdn.microsoft.com/en-us/library/windows/desktop/ms648393%28v=vs.85%29.aspx

另一个解决方案是将SetCursor函数绕道/挂钩到我们的,只是将用户消息发送到GUI线程,发出信号来设置光标。

两种解决方案都有其优点,当然还有:),缺点。