在.NET中对ActiveX控件的窗口过程进行子类化

时间:2011-05-05 15:18:18

标签: c# .net activex

我在我的应用程序中使用Flash ActiveX控件。我想禁用其右键菜单。由于控件没有为此提供API,我想继承窗口过程并拦截WM_RBUTTONDOWN消息。我成功地在Qt下做了这个,但我不知道如何在C#中做到这一点。

在我的C ++ / Qt实现中,我使用SetWindowLong来存储activex包装器的this指针,而该指针又有一个存储oringal窗口proc的字段。我将窗口过程设置为挖掘(再次使用SetWindowLong)以及我不想处理的任何消息,我使用CallWindowProc传递给原始WNDPROC。

我如何在.NET下执行此操作?

2 个答案:

答案 0 :(得分:3)

您可以在C#中以完全相同的方式执行此操作。您需要使用P / Invoke从托管代码调用非托管Windows API。网上有很多文章介绍如何使用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()

答案 1 :(得分: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);
}
}