2

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

当用户将鼠标悬停在 SWF 中的按钮上时,flash 在内部调用 WinAPISetCursor函数来设置IDC_HAND光标 - 我可以看到,当我通过API Monitor V2 (rohitab.com)监控 WinAPI 对光标相关函数的调用时。但是,在我的情况下,光标没有改变,即保持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 个相似的设置产生相反的结果。

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

但是,如果我只是创建一个简单的示例,基本上在 winmain 上创建一个播放器,那么上面的代码可以完美运行并且光标会发生变化。

因此,在第一种情况下,某些东西似乎确实重置了光标状态。如何找出重置光标的原因

4

2 回答 2

2

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

另一种解决方案可以是绕过/挂钩 SetCursor 函数到我们的函数,它只是向 GUI 线程发送用户消息,发出设置光标的信号。

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

于 2012-02-29T11:57:31.297 回答
1

您的窗口(父窗口)在覆盖光标时出现裂缝并返回 TRUE (1) 表示您已处理它并停止进一步处理。箭头可能来自您的 WNDCLASS 注册或来自 DefWindowProc。

因此,在我看来,您希望返回 FALSE 以允许子按钮在实际设置光标时有所突破。或者,完全删除处理 WM_SETCURSOR。

于 2012-01-26T15:57:43.123 回答