2

Flash ocx を使用して SWF ファイルを再生する C++ アプリケーションを管理しています。

ユーザーが SWF のボタンにカーソルを合わせると、フラッシュが内部的に WinAPISetCursor関数を呼び出してカーソルを設定します。API Monitor V2 (rohitab.com)IDC_HANDを介してカーソル関連関数への 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

OK、この質問に対する本当の答えは、非 GUI スレッドはカーソルを直接変更できないということです。ページの下部にあるコメントを参照してください http://msdn.microsoft.com/en-us/library/windows/desktop/ms648393%28v=vs.85%29.aspx

もう 1 つの解決策は、SetCursor 関数を迂回/フックして、ユーザー メッセージを GUI スレッドに送信し、カーソルを設定するように通知することです。

どちらのソリューションにも長所があり、もちろん :)、短所もあります。

于 2012-02-29T11:57:31.297 に答える
1

あなたのウィンドウ(親)は、カーソルをオーバーライドしてTRUE(1)を返すと、それを処理したことを示し、その後の処理を停止します。矢印は、おそらく WNDCLASS 登録または DefWindowProc から来ています。

したがって、FALSE を返して、実際にカーソルを設定する際に子ボタンにクラックを許可するように思われます。または、WM_SETCURSOR の処理を​​完全に削除します。

于 2012-01-26T15:57:43.123 に答える