等待鼠标点击功能

时间:2015-06-29 06:59:30

标签: c#

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

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

我的问题是我无法获得等待MouseClick功能的功能。

2 个答案:

答案 0 :(得分:1)

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

您可以对ENTER执行相同的操作:如果有人点击ENTER并且您尚未允许,请不要再处理该事件。您可以使用KeyDown事件。

答案 1 :(得分:0)

您不想等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来处理删除事件处理程序并再次启用该按钮。