[英]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.