繁体   English   中英

.NET中ActiveX控件的子类化窗口过程

[英]Subclassing window procedure of an ActiveX control in .NET

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

在我的C ++ / Qt实现中,我使用SetWindowLong来存储activex包装器的this指针,后者又具有一个用于存储原始窗口proc的字段。 我将窗口过程设置为我的窗口过程(再次使用SetWindowLong ),并且将不需要处理的任何消息传递给带有CallWindowProc的原始WNDPROC。

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

您可以在C#中完全相同地进行此操作。 您需要使用P / Invoke从托管代码中调用非托管Windows API。 网络上有很多文章介绍了如何使用P / Invoke。

事实上,你可以用它做以更简单的方式NativeWindow类作为解释在这里 代码如下所示:

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()

尽管这是一个古老的代码,但我只是从此链接中看到了这段代码,它非常有用。 本质上,它是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);
}
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM