2012-01-26 3 views
0

私は、SWFファイルを再生するためにflash ocxを使用するC++アプリケーションを維持しています。SetCursorとは別にカーソルの形状をリセットすることはできますか?

ユーザーがSWF内のボタンの上に置いた、フラッシュは内部IDC_HANDカーソルを設定するWinAPIのSetCursor関数への呼び出しを行う - 私は私が監視したときにWinAPIのはAPI Monitor V2 (rohitab.com)を経由して、カーソルに関連した関数の呼び出していることがわかります。しかし、私の場合、カーソルは変化しない、すなわち、IDC_ARROWのままである。

アプリケーション自体は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; 
    } 

誰も私がこのケースで/変更カーソルの形状をリセットすることができる人に知らせてくださいすることができます。アプリケーションのウィンドウには、すなわち、カーソルを復元しません、以下のようWM_SETCURSORメッセージを処理しますか?

更新:興味深いのは、私は2つの同様の設定が反対の結果を生み出すという事実です。

私が維持しているアプリケーションは実際には "SysListView32"にWH_GETMESSAGEフックをインストールし、Flash Playerを作成するスレッドを起動します。だからセットアップはそれほど単純ではありません。

ただし、基本的にwinmainでプレーヤを作成する簡単な例を作成すると、上のコードは完全に機能し、カーソルが変更されます。

したがって、最初のケースで何かがカーソルの状態をリセットするように見えます。どのようにを見つけるには

答えて

0

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

別の解決策は、単にカーソルを設定するために、シグナリング、GUIのスレッドにユーザメッセージを送ることを私たちにのSetCursor関数をフック/迂回することができます。

両方のソリューションには、それぞれの賛否両論があります。

1

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

だから、カーソルを実際に設定するときに子ボタンに亀裂が入るようにするには、FALSEを戻したいと思うようです。または、WM_SETCURSORをすべて削除しないでください。

+0

私はDefWindowProcがWNDCLASSに基づいてカーソルを設定すると思いますので、/または両方ではありません。 –

+0

ちょっと待ってください。子供はWM_SETCURSORを先に取得しませんか?したがって、子がWM_SETCURSORを処理しない場合、DefWindowProcを介して親に移動します。 http://blogs.msdn.com/b/oldnewthing/archive/2006/11/21/1115695.aspx – Alex

+0

問題は、上記のコードが**動作することです**サンプルアプリケーションを使用してかなりのプレーヤーを作成すると多くのwinmain()。しかし、同じことをする私のアプリケーションでは動作しませんが、フックや他のスレッドが関わっています。さらに、両方のアプリケーション(実際とサンプル)はWinAPIモニタソフトウェアで**同一の**出力を生成します。 – Alex

関連する問題