2015-10-15 70 views
6

當我們點擊鼠標並在.NET程序中觸發了一個MouseClick事件時,計算機如何知道我們點擊了按鈕邊界中的正確點?如何在WinForms事件中單擊鼠標按鈕?

我的意思是引擎蓋下怎麼回事,我們爲什麼不需要實現?

回答

3

基本上是這樣的Windows UI framework named User32做什麼你。另見MSDN: Windows and Messages

這個框架的工作原理是讓你的應用程序中實現它從Windows接收消息的「消息泵」。消息可以是「剛好移過該窗口中的鼠標」「鼠標按鈕被按下」。請注意,「窗口」不僅僅是窗體意義上的「窗口」,請務必閱讀MSDN鏈接。一個按鈕也是一個窗口。

所以:

  • 一隻老鼠在一個硬件總線
  • 用戶移動鼠標
  • 硬件信號會轉換到軟件信號
  • 的Windows連接到PC會將這些信號的消息
  • 的Windows分派這些消息給適當的應用程序的消息泵
  • 的應用做es無論它想要什麼這些消息

現在,.NET的WinForms爲您封裝了這個消息泵,並將消息公開爲可訂閱的事件。您可以通過overriding WndProc() on your control of coice看到它在行動:

protected override void WndProc(ref Message m) 
{ 
    Console.WriteLine(m); 
    base.WndProc(ref m); 
} 

更深入的(從MSDN: About Messages and Message Queues),Windows消息被關聯到一個窗口(或WinForms的術語「控制」)使用手柄。該句柄唯一標識一個控件。

這樣WinForms知道帶柄X的mouse message是用於控制Y的那個柄,所以它會在收到該消息時引發MouseClick或相關事件。

+0

謝謝你的回答。 Windows中的所有消息系統是用C語言還是其他語言編寫的? – Lyrk

+0

Windows消息是一種語言不可知的內存概念。您可以調用User32庫,以您選擇的編程語言接收消息。 – CodeCaster

3

跟蹤鼠標位置&狀態由操作系統本身處理,當鼠標移動/點擊/等時,會有一大堆輸入標誌被髮送到應用程序。您將在C++或C應用程序(See Here)中使用的相同窗口WM_LBUTTONDOWN和WM_LBUTTONUP事件被.Net框架攔截並轉換爲我們都知道並喜愛的點擊事件。這一切都是由框架本身處理的,具體到它將這些轉換成'這個特定的按鈕被點擊'的具體細節,我不知道,但是在一天結束時它是真的無關緊要的。

你並不需要實現它,因爲.NET Framework和它的UI元素的開發商意識到,每個人都需要實現一個按鈕的功能,所以沒有對我們來說。

+0

謝謝你的答案。 – Lyrk

3

Windows使用消息傳遞模型。操作系統通過向其傳遞消息來與您的應用程序窗口進行通信。消息只是指定特定事件的數字代碼。例如,如果用戶按下鼠標左鍵,則窗口將收到帶有以下消息代碼的消息。

一些消息具有與它們相關聯的數據。例如,WM_LBUTTONDOWN消息包含鼠標光標的x座標和y座標。

要將消息傳遞給窗口,操作系統會調用爲該窗口註冊的窗口過程。 (現在你知道窗口程序的用途了。),對於模式詳細信息,你可以閱讀這篇文章,Window Messages

+0

謝謝你的回答。 – Lyrk

+0

不客氣@Lyrk – Adil