我想轉發MouseWheel
在表單級別生成的事件,以便即使在該控件沒有焦點時,它們也會由嵌入的WebBrowser
控件處理。將MouseWheel消息發送到System.Windows.Forms.WebBrowser
這裏是我做了什麼:
- 實現
IMessageFilter.PreFilterMessage
。 - 註冊過濾器它與
Application.AddMessageFilter
。 - 在過濾器中,請收聽
WM_MOUSEWHEEL
消息。 - 使用
SendMessage
轉發郵件到目標控件(在本例中爲WebBrowser
)。
在代碼中,這看起來是這樣的:
bool IMessageFilter.PreFilterMessage(ref Message m)
{
if (m.Msg == 0x20A) // WM_MOUSEWHEEL
{
if (this.target != null)
{
var handle = this.target.Handle;
Native.SendMessage (handle, m.Message, m.WParam, m.LParam);
return true;
}
}
return false;
}
// Registering the message filter:
System.Windows.Forms.Application.AddMessageFilter (this);
// Win32 code:
protected static class NativeMethods
{
[System.Runtime.InteropServices.DllImport ("user32.dll")]
public static extern System.IntPtr SendMessage(System.IntPtr hWnd, System.Int32 Msg, System.IntPtr wParam, System.IntPtr lParam);
}
這是行不通的。什麼都沒發生。
但是,如果不是WebBrowser
,我指定Panel
作爲目標,那麼這個工作非常好。
除了從C#到VB翻譯,什麼是你必須做的好辦法? –
嗨皮埃爾。只是一對夫婦,可能只是與使VB.NET和C#不同的東西有關。我最初通過Developerfusion上的代碼轉換工具運行你的代碼,但它並沒有馬上工作。有一件事是用m.HWnd替換this.target;另一個是用m.Msg替換m.Message。在第二點上,我想知道它是否是原始C#示例中的拼寫錯誤?乾杯,羅賓 –
是的,的確,「m.Msg」是我的一個錯字。對不起,我編輯了我的答案,以使其筆直。 –