2014-01-23 77 views
3

當鼠標移動到一個子控件MouseDown事件不會叫上表的任何地方。我嘗試了KeyPreview = true;,但它沒有幫助(雖然它爲KeyDown - 鍵盤點擊)。捕捉鼠標點擊(不IMessageFilter)可以

我正在尋找類似KeyPreview,但是對於鼠標事件。

我寧可不使用IMessageFilter和處理WinAPI的消息,如果有一個更簡單。替代(另外,IMessageFilter設置應用 - 寬。我只想 - 寬。)並遍歷所有子控件,訂閱各自都有自己的缺點。

+0

你有沒有看MouseHover事件? http://msdn.microsoft.com/en-us/library/system.windows.forms.control.mousehover(v=vs.110).aspx – Bit

+0

@downvoter注意評論爲什麼? – ispiro

+0

儘管有您的要求,您已經刪除了所有可能性。你將不得不從這兩個選擇中選擇一個。 (我不是下來的選民)。 – LarsTech

回答

8

你仍然可以使用的MessageFilter,只是過濾了的ActiveForm:在您的形式

private class MouseDownFilter : IMessageFilter { 
    public event EventHandler FormClicked; 
    private int WM_LBUTTONDOWN = 0x201; 
    private Form form = null; 

    [DllImport("user32.dll")] 
    public static extern bool IsChild(IntPtr hWndParent, IntPtr hWnd); 

    public MouseDownFilter(Form f) { 
    form = f; 
    } 

    public bool PreFilterMessage(ref Message m) { 
    if (m.Msg == WM_LBUTTONDOWN) { 
     if (Form.ActiveForm != null && Form.ActiveForm.Equals(form)) { 
     OnFormClicked(); 
     } 
    } 
    return false; 
    } 

    protected void OnFormClicked() { 
    if (FormClicked != null) { 
     FormClicked(form, EventArgs.Empty); 
    } 
    } 
} 

然後,將其附加:

public Form1() { 
    InitializeComponent(); 
    MouseDownFilter mouseFilter = new MouseDownFilter(this); 
    mouseFilter.FormClicked += mouseFilter_FormClicked; 
    Application.AddMessageFilter(mouseFilter); 
} 

void mouseFilter_FormClicked(object sender, EventArgs e) { 
    // do something... 
}