我在我的应用程序中使用Flash ActiveX控件。我想禁用其右键菜单。由于控件没有为此提供API,我想继承窗口过程并拦截WM_RBUTTONDOWN消息。我成功地在Qt下做了这个,但我不知道如何在C#中做到这一点。
在我的C ++ / Qt实现中,我使用SetWindowLong
来存储activex包装器的this
指针,而该指针又有一个存储oringal窗口proc的字段。我将窗口过程设置为挖掘(再次使用SetWindowLong
)以及我不想处理的任何消息,我使用CallWindowProc传递给原始WNDPROC。
我如何在.NET下执行此操作?
答案 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);
}
}