2011-05-05 16 views
1

私はアプリケーションでFlash ActiveXコントロールを使用しています。右クリックメニューを無効にしたいと思います。コントロールがこのためのAPIを提供しないので、私はウィンドウプロシージャをサブクラス化し、WM_RBUTTONDOWNメッセージを傍受したいと思います。私はsuccesstuly Qtの下でこれをしましたが、私はどのようにC#でそれを行うことができないのか分かりません。.NETのActiveXコントロールのサブクラス化ウィンドウプロシージャ

私のC++/Qtの実装では、SetWindowLongを使用して、activexラッパーのポインタを格納していましたが、これにはoringalウィンドウprocを格納したフィールドがありました。私はウィンドウプロシージャを私に(SetWindowLongで)設定し、処理したくないメッセージをCallWindowProcで元のWNDPROCに渡します。

.NETでこれを行うにはどうすればよいですか?

答えて

3

これはC#でもまったく同じ方法で行うことができます。マネージコードからアンマネージWindows APIを呼び出すには、P/Invokeを使用する必要があります。 Webには、P/Invokeの使い方を示す記事がたくさんあります。

実際にはNativeWindowクラスを使用してより簡単にファッションを行うことができます(here)。コードは次のようになります。

public class SubclassHWND : NativeWindow 
{ 
    protected override void WndProc(ref Message m) 
    { 
     // Perform whatever custom processing you must have for this message 
     System.Diagnostics.Debug.WriteLine(m.ToString()); 
     // forward message to base WndProc 
     base.WndProc(ref m); 
    } 
} 

SubclassHWND s = new SubclassHWND(); 
s.AssignHandle(theWindowHandle); 
//Now s should be listening to the messages of the form. 

関数ポインタの代わりに、デリゲートを使用する別の方法を次のとおりです。Marshal.GetFunctionPointerForDelegate()

+0

私は本当にSetWindowLong関数にC#メソッドを渡すことはできますか? –

+0

はい、そうすることができますし、そうすることは日常的です。 –

+0

私はwebsearchを自分でやったことがあり、P/Invokeがなくても実際にはもっと簡単な方法で可能であることが判明しました。 –

0

これは古いものですが、私はちょうどこのリンクから、このコードに出くわし、それ非常に便利です。基本的に、ActiveXコントロール自体をサブクラス化し、その時点で右クリックを無効にします。

経由:http://www.codeproject.com/Articles/29102/How-To-Disable-FlashPlayer-AxShockwaveFlash-Right

public class IForcePlayer : AxShockwaveFlash 
{ 
const int WM_RBUTTONDOWN = 0x0204; 

protected override void WndProc(ref Message m) 
{ 
    if (m.Msg == WM_RBUTTONDOWN) 
    { 
     m.Result = IntPtr.Zero; 
     return; 
    } 
    base.WndProc(ref m); 
} 
} 
関連する問題