2013-04-18 57 views
3

我正在使用一個我不太熟悉的C#WinForms應用程序。該控件的目的是可拖動的,如果用戶在控件的某些部分中啓動拖動,而在其他部分中則不可拖動。查找丟失的鼠標點擊

該控件包含多個子控件,並且我相信這些子控件中的某些控件在父控件看到它們之前捕獲鼠標單擊,因此在某些區域發生故障。我已經在調試器中確認,只有當用戶單擊特定的子控件時纔會調用父級的鼠標移動處理程序。

鑑於我知道點擊在他們到達我的處理程序之前被捕獲/壓縮,調試器(或其他方式)有沒有方法確定點擊的位置?盯着代碼沒有成功,因爲我不知道從哪裏開始。

+0

我相信,如果您在父控件上啓用KeyPreview屬性,那麼您將在子控件執行之前捕獲事件。不太確定。 –

+0

謝謝,但它看起來像KeyPreview只適用於按鍵,而不是鼠標事件。 – Stefan

回答

4

與Visual Studio捆綁出現一個名爲Spy++的小程序。它允許您將log all messages發送到窗口,並向您顯示窗口內的Win32控件的「真實」結構(許多控件實際上不是控件,而只是自定義繪製的屏幕區域)。您應該能夠通過一些檢查找到帶有消息日誌的罪魁禍首。

+0

謝謝,這幾乎是我需要的!它確實識別所有控件,並檢測事件,但它告訴我所有鼠標事件都會進入頂層窗口(比我感興趣的控件高出幾個級別)。所以我不能在表單中爲特定的鼠標按鍵調用處理程序。 – Stefan

+0

這就是Windows的工作原理 - 所有的消息都被髮送到頂層窗口,然後通過DispatchMessage的Win32 API函數向下分發。因此,您應該能夠通過覆蓋Form實例中的'Control.WndProc'方法來預覽大部分(如果不是全部)消息。欲瞭解更多信息,請參閱http://msdn.microsoft.com/en-us/library/system.windows.forms.control.wndproc.aspx –

+0

覆蓋Control.WndProc將允許我看到消息來自哪裏,但不是在哪裏DispatchMessage將發送它們,這正是我感興趣的內容。與以前一樣,從Windows進入的消息沒有問題,這是我需要了解的地方。 – Stefan