Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NET中ActiveX控件的子类化窗口过程_C#_.net_Activex - Fatal编程技术网

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

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

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

在我的C++/Qt实现中,我使用
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);
}
}