C# NET中ActiveX控件的子类化窗口过程
我正在应用程序中使用Flash ActiveX控件。我想禁用它的右键单击菜单。由于控件没有为此提供API,我想对窗口过程进行子类化,并截获WM_RBUTTONDOWN消息。我在Qt下成功地做到了这一点,但我不知道如何在C#中做到这一点 在我的C++/Qt实现中,我使用C# NET中ActiveX控件的子类化窗口过程,c#,.net,activex,C#,.net,Activex,我正在应用程序中使用Flash ActiveX控件。我想禁用它的右键单击菜单。由于控件没有为此提供API,我想对窗口过程进行子类化,并截获WM_RBUTTONDOWN消息。我在Qt下成功地做到了这一点,但我不知道如何在C#中做到这一点 在我的C++/Qt实现中,我使用SetWindowLong来存储activex包装器的这个指针,而activex包装器又有一个存储原始窗口过程的字段。我将window过程设置为mine(再次使用SetWindowLong),并且任何我不想处理的消息都会通过Call
SetWindowLong
来存储activex包装器的这个
指针,而activex包装器又有一个存储原始窗口过程的字段。我将window过程设置为mine(再次使用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.
使用委托代替函数指针的另一种方法是:虽然这是一个旧的方法,但我刚刚从这个链接中看到了这段代码,它非常有用。本质上,它是ActiveX控件本身的子类,并在该点禁用右键单击 通过:
我真的可以将C#方法传递给SetWindowLong吗?是的,你可以这样做,这是例行的。我自己做了一个Web搜索,发现不使用P/Invoke实际上可以以更简单的方式实现-请参见编辑。谢谢你的回答。与此同时,我发现了如何将C#方法作为函数指针传递给winapi,我将它添加到您的答案中,供未来的谷歌用户使用(如果您不介意的话:)。
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);
}
}