簡體   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