等待鼠标点击功能

本文关键字:功能 鼠标 等待 | 更新日期: 2023-09-27 18:00:10

在我的一个班里,我得到了List<Point> mousePointList = clickArea.getClicks();

函数getClicks()应该返回一个点列表,其中包含执行该函数后每次单击的条目。单击多次后,您应该能够通过按ENTER键来完成该功能。

我的问题是,我无法获得等待鼠标点击功能的函数。

等待鼠标点击功能

我认为你的逻辑错了。你不能等待鼠标点击,相反,你只会收到一个事件(通过你的FormMouseClick事件左右),你会采取相应的行动。

你可以对ENTER做同样的事情:如果有人点击ENTER,而你还不允许,就不要再处理这个事件了。您可以为此使用KeyDown事件。

您不想等待MouseClick。你想做的是从你的功能内部连接一个延续:

void Main()
{
    Form frm = new Form();
    var btn = new Button { Text = "Start" };
    btn.Click += (_, __) =>
        {
            var clicks = new List<Point>();
            MouseEventHandler mouseUp = (s, e) =>
                {
                    clicks.Add(e.Location);
                };
            var eventHelper = new EventHelper { MouseUp = mouseUp };
            KeyEventHandler keyUp = (s, e) =>
                {
                    if (e.KeyCode == Keys.Return)
                    {
                        frm.MouseUp -= eventHelper.MouseUp;
                        frm.KeyUp -= eventHelper.KeyUp;
                        btn.Enabled = true;
                        // Finish
                        clicks.Dump();
                    }
                };
            eventHelper.KeyUp = keyUp;
            frm.MouseUp += mouseUp;
            frm.KeyUp += keyUp;
            btn.Enabled = false;
        };
    frm.Controls.Add(btn);
    Application.Run(frm);
}
class EventHelper
{
    public MouseEventHandler MouseUp;
    public KeyEventHandler KeyUp;
}

请注意,clicks变量保持为局部变量,不需要在整个表单上显式定义字段或类似的内容。注册和注销事件处理程序有点麻烦,但我希望这能足够清楚地表明意图。不过,不要忘记事件处理程序是全局的——如果有更多的按钮可能也在等待这些事件,它们将同时接收所有。这可能是个问题,也可能不是个问题,这取决于你的具体情况(但这是简单地拥有一个表单所固有的——除了在按下其中一个按钮时禁用所有冲突按钮之外,没有其他方法可以解决这个问题)。

使用await也很容易避免手动编写回调-我将把它留给读者:)这对于可靠性来说非常方便-示例代码可以很容易地导致按钮永远被禁用,如果某个地方出现异常,也可以永远指定事件处理程序。对于await,您只需使用try finally来处理删除事件处理程序并再次启用按钮的操作。