【问题标题】:How does clicking a mouse button end up in a WinForms event?单击鼠标按钮如何在 WinForms 事件中结束?
【发布时间】:2015-10-15 08:57:02
【问题描述】:

当我们单击鼠标并在 .NET 程序中触发 MouseClick 事件时,计算机如何知道我们单击了按钮边界中的正确点?

我的意思是幕后发生了什么,为什么我们不需要实现它?

【问题讨论】:

    标签: c# winforms events


    【解决方案1】:

    基本上这就是Windows UI framework named User32 为您做的事情。另见MSDN: Windows and Messages

    此框架通过让您的应用程序实现从 Windows 接收消息的“消息泵”来工作。消息可以是“鼠标刚刚移过这个窗口”“鼠标按钮被按下”。请注意,“窗口”不仅仅是形式意义上的“窗口”,请务必阅读 MSDN 链接。一个按钮也是一个窗口。

    所以:

    • 鼠标通过硬件总线连接到 PC
    • 用户移动鼠标
    • 硬件信号被转换为软件信号
    • Windows 将这些信号转换为消息
    • Windows 将这些消息分派到相应应用程序的消息泵
    • 应用程序可以随心所欲地处理这些消息

    现在 .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中的这些消息系统都是用C语言还是其他语言编写的?
    • Windows 消息是一种与语言无关的内存概念。您调用 User32 库以接收您选择的编程语言的消息。
    【解决方案2】:

    跟踪鼠标位置和状态由操作系统本身处理,当鼠标移动/点击/等时,会有一大堆输入标志发送到应用程序。您将在 C++ 或 C 应用程序 (See Here) 中使用的相同窗口 WM_LBUTTONDOWN 和 WM_LBUTTONUP 事件被 .Net 框架拦截并转换为我们都知道和喜爱的单击事件。这一切都由框架本身处理,我不知道它以一种有效的方式将它们转换为“点击了这个特定按钮”的具体细节,但归根结底,这真的无关紧要。

    您不需要实现它,因为 .Net Framework 及其 UI 元素的开发人员意识到每个人都需要为按钮实现该功能,我们也这样做了。

    【讨论】:

      【解决方案3】:

      Windows 使用消息传递模型。操作系统通过向其传递消息来与您的应用程序窗口进行通信。消息只是指定特定事件的数字代码。例如,如果用户按下鼠标左键,则窗口会收到一条带有以下消息代码的消息。

      有些消息有与之关联的数据。例如,WM_LBUTTONDOWN 消息包含鼠标光标的 x 坐标和 y 坐标。

      为了向窗口传递消息,操作系统调用为该窗口注册的窗口过程。 (现在你知道窗口过程是干什么用的了。),关于模式详情你可以阅读这篇文章,Window Messages

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多