2012-06-04 49 views
1

我試圖通過IMessageFilterPreFilterMessage捕捉我的應用程序控件上的單擊事件。但我只能實現捕捉鼠標點擊,而不是控制事件。使用MessageFilter在控件上捕獲單擊事件

在我的應用程序中,我需要來自控件的消息來記錄控件的名稱和類型。

我用下面的代碼來捕獲鼠標事件與if (m.Msg >= 513 && m.Msg <= 515)

public class TestMessageFilter : IMessageFilter 
{ 
    public bool PreFilterMessage(ref Message m) 
    { 
     // Filter click events with a message number ? 
     if (m.Msg == ?) 
     { 
      // Log stuff 
     } 
     return false; 
    } 
} 

有沒有辦法趕上點擊與IMessageFilter或其他過濾器的事件?

+0

您可以製作自定義事件並通過它發送數據。 – Kim

+0

這個應用程序很大,需要很長時間來修改應用程序內的所有控件。我們使用「標準」事件,所以我認爲我只是在過濾器上丟失了某些東西(可能是正確的消息編號或名稱)。 – Mualig

+0

您無法通過過濾消息泵來獲取託管事件。你的消息過濾器只能給你一個點擊事件:之後你需要檢查當前的光標座標並自己找到點擊的控件。 – Groo

回答

2

否(一句話)。 MessageFilter就是它所說的,它過濾了系統窗口消息。它與託管代碼無關,它正在偵聽Windows消息並對其進行過濾。

然而,一旦被捕獲,你可以對消息作出反應,並做你喜歡的任何事情 - 即調用你想要的託管代碼,跟蹤鍵或鼠標位置等。在你的情況下,你需要找到鼠標位置,並檢查是否點擊是在一個控件上,然後手動調用click事件。

+0

來自MSDN:「使用PreFilterMessage在將消息分派給控件或表單之前過濾掉」。 – Mualig

相關問題