单击鼠标按钮如何在WinForms事件中结束
本文关键字:WinForms 事件 结束 鼠标 按钮 单击 | 更新日期: 2023-09-27 18:17:44
当我们点击鼠标并在。net程序中触发一个MouseClick事件时,计算机如何知道我们点击了按钮边界中的正确点?
我的意思是在幕后发生了什么,为什么我们不需要实现它?
基本上这就是名为User32的Windows UI框架为你做的事情。请参见MSDN: Windows和消息。
这个框架的工作原理是让你的应用实现一个"消息泵"来接收来自Windows的消息。消息可以是"鼠标刚刚移动到此窗口上"或"鼠标按钮被按下"。请注意,"窗口"不仅仅是窗体意义上的"窗口",请务必阅读MSDN链接。按钮也是一个窗口。
:
- 鼠标通过硬件总线连接到PC上
- 用户移动鼠标
- 硬件信号转换为软件信号
- Windows将这些信号转换为消息
- Windows将这些消息分配到适当的应用程序的消息泵
- 应用程序对这些消息做任何它想做的事情
现在。net的WinForms为你包装了这个消息泵,并将消息公开为你可以订阅的事件。你可以通过重写控件
上的WndProc()
来看到它的作用:
protected override void WndProc(ref Message m)
{
Console.WriteLine(m);
base.WndProc(ref m);
}
更深入(来自MSDN:关于消息和消息队列),Windows消息使用句柄与窗口(或WinForms术语中的"控件")相关联。此句柄唯一标识控件。
通过这种方式,WinForms知道带有句柄X的鼠标消息是用于带有该句柄的控件Y的,因此它在接收该消息时引发MouseClick或相关事件。
跟踪鼠标位置&状态是由操作系统本身处理的,当鼠标移动/被点击/等时,有一大堆的输入标志被发送给应用程序。同样的windows WM_LBUTTONDOWN和WM_LBUTTONUP事件,你会在c++或C应用程序中使用(见这里),被。net框架截获并转换成我们都知道和喜欢的点击事件。这一切都是由框架本身处理的,我不知道它到底是怎么做的,以一种有效的方式将这些转化为"这个特定的按钮被点击了",但最终它真的是无关紧要的。
你不需要实现它,因为。net框架及其UI元素的开发人员意识到每个人都需要为按钮实现该功能,我们也是这样做的。
Windows使用消息传递模型。操作系统通过传递消息与应用程序窗口进行通信。消息只是指定特定事件的数字代码。例如,如果用户按下鼠标左键,窗口将收到一条消息,消息代码如下:
一些消息有与它们相关联的数据。例如,WM_LBUTTONDOWN消息包含鼠标光标的x坐标和y坐标。
要将消息传递给窗口,操作系统调用为该窗口注册的窗口过程。(现在您知道了窗口过程是用来做什么的),关于模式的详细信息,您可以阅读这篇文章,窗口消息