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