Winforms UserControl有时不使用';无法接收单击消息

Winforms UserControl有时不使用';无法接收单击消息,winforms,windows-mobile,compact-framework,windows-ce,Winforms,Windows Mobile,Compact Framework,Windows Ce,我正在编写一个具有按钮式行为的自定义控件。用户需要能够处理click事件,控件需要发出可视信号,表示它已被按下。我在OnMouseDown方法中更改控件的视觉状态,并在OnMouseDown中将其还原,这非常有效;然而,我在测试中注意到,我的控件并不总是会收到鼠标点击的消息,但是设备发出了正确的听觉信号来进行点击,并且控件没有失去焦点 另外,如果有人知道一个好的实用程序,它可以让我记录发送到我的应用程序的windows消息,这将非常棒,也许可以帮助我了解可能出现的问题 这里是我所拥有的非常简化的

我正在编写一个具有按钮式行为的自定义控件。用户需要能够处理click事件,控件需要发出可视信号,表示它已被按下。我在OnMouseDown方法中更改控件的视觉状态,并在OnMouseDown中将其还原,这非常有效;然而,我在测试中注意到,我的控件并不总是会收到鼠标点击的消息,但是设备发出了正确的听觉信号来进行点击,并且控件没有失去焦点

另外,如果有人知道一个好的实用程序,它可以让我记录发送到我的应用程序的windows消息,这将非常棒,也许可以帮助我了解可能出现的问题

这里是我所拥有的非常简化的版本

public class CustomButton : UserControl
{
    private bool _isMouseDown = false;//flag tells PaintBorder what state to draw

    protected override void OnPaint(PaintEventArgs e)
    {
         base.OnPaint(e);
         PaintBackground(e);
         PaintBorder(e, _isMouseDown);
    }

    protected override void OnGotFocus(EventArgs e)
    {
        this.Invalidate();
        base.OnGotFocus(e);
    }

    protected override void OnTextChanged(EventArgs e)
    {
        this.Invalidate();
        base.OnTextChanged(e);
    }

    protected override void OnMouseDown(MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            _isMouseDown = true;

            if (!this.Focused)
            {
                this.Focus();
            }
            else //getting focus causes Invalidate, no need to call twice
            {
                this.Invalidate();
            }
        }
        base.OnMouseDown(e);
    }

    protected override void OnClick(EventArgs e)
    {
        base.OnClick(e);
    }

    protected override void OnMouseUp(MouseEventArgs e)
    {
        if (_isMouseDown)
        {
            _isMouseDown = false;
            this.Invalidate();
        }
        base.OnMouseUp(e);
    }
}

对于Compact Framework,我的按钮控件也有类似的问题

事实证明,如果你足够快地点击一个按钮,一些
点击
s将变成
双击
s

此代码为我解决了以下问题:

protected override void OnDoubleClick(EventArgs e)
{
    base.OnClick(e);
}

请注意,插入此代码后,
双击
将不再有效。

发布一些代码,以显示如何创建按钮以及如何处理它们的操作。没有它,我们只能猜测到底发生了什么。@NicholasPost:代码启动了!要查看窗口消息,可以使用RemoteSpy(WM SDK附带的远程工具的一部分):。它的工作原理类似于本地VS Spy工具。对于间谍和日志记录,您可以实现DrDobbs cespy来拦截消息API。