我维护一个使用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的播放器,那么上面的代码就可以完美地工作并且光标会被更改。
所以在第一种情况下,某些东西确实会重置光标状态。如何找出重置光标的内容?
答案 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线程,发出信号来设置光标。
两种解决方案都有其优点,当然还有:),缺点。