當我們點擊鼠標並在.NET程序中觸發了一個MouseClick事件時,計算機如何知道我們點擊了按鈕邊界中的正確點?如何在WinForms事件中單擊鼠標按鈕?
我的意思是引擎蓋下怎麼回事,我們爲什麼不需要實現?
當我們點擊鼠標並在.NET程序中觸發了一個MouseClick事件時,計算機如何知道我們點擊了按鈕邊界中的正確點?如何在WinForms事件中單擊鼠標按鈕?
我的意思是引擎蓋下怎麼回事,我們爲什麼不需要實現?
基本上是這樣的Windows UI framework named User32做什麼你。另見MSDN: Windows and Messages。
這個框架的工作原理是讓你的應用程序中實現它從Windows接收消息的「消息泵」。消息可以是「剛好移過該窗口中的鼠標」或「鼠標按鈕被按下」。請注意,「窗口」不僅僅是窗體意義上的「窗口」,請務必閱讀MSDN鏈接。一個按鈕也是一個窗口。
所以:
現在,.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或相關事件。
Windows使用消息傳遞模型。操作系統通過向其傳遞消息來與您的應用程序窗口進行通信。消息只是指定特定事件的數字代碼。例如,如果用戶按下鼠標左鍵,則窗口將收到帶有以下消息代碼的消息。
一些消息具有與它們相關聯的數據。例如,WM_LBUTTONDOWN消息包含鼠標光標的x座標和y座標。
要將消息傳遞給窗口,操作系統會調用爲該窗口註冊的窗口過程。 (現在你知道窗口程序的用途了。),對於模式詳細信息,你可以閱讀這篇文章,Window Messages
謝謝你的回答。 Windows中的所有消息系統是用C語言還是其他語言編寫的? – Lyrk
Windows消息是一種語言不可知的內存概念。您可以調用User32庫,以您選擇的編程語言接收消息。 – CodeCaster