在父表单中检测鼠标单击,但在子表单外部检测

时间:2011-12-11 19:08:21

标签: c# winforms

我正在尝试实现一个UI,父窗体通过showDialog()加载子窗体。每当我点击子表单之外的任何地方,但在父表单内部时,子表单将被关闭。单击父窗体外的任何位置只会导致正常的“alt-tab”操作。我该怎么做?

2 个答案:

答案 0 :(得分:2)

如果表单中没有任何控件(例如,如果您正在查看图片)。然后你就可以抓住鼠标了:

    protected override void OnLoad( EventArgs e )
    {
        base.OnLoad( e );
        this.Capture = true;
    }

之后,如果点击位于表单之外,您只需签入OnMouseDown即可。

其他,可以使用

    protected override void WndProc(ref Message m)
    {
        if ( m.Msg==0x86 && (int)m.WParam==0 )
            if ( this.DialogResult==DialogResult.None )
                this.DialogResult = DialogResult.OK;
        base.WndProc (ref m);
    }

它在Windows XP中运行良好,但在Windows 7中它听起来也是哔哔声,我还没有调查原因。

答案 1 :(得分:0)

我需要同样的行为。

当我的应用程序启动时,会显示一个广告表单,并且只要用户单击主表单就必须关闭该表单。

基于WM_SETCURSOR消息,这里是我的解决方案(放入主窗体):

protected override void WndProc(ref Message m)
{
        var vanishingDialog = ActiveForm as IVanishingDialog;

        //0x0201FFFE is for : 0201 (left button down) and FFFE (HTERROR).
        if ((m.Msg == 0x20) && (m.LParam.ToInt32() == 0x0201FFFE) && (vanishingDialog != null))
        {
            vanishingDialog.Vanish();
        }
        else
        {
            base.WndProc(ref m);
        }
}

我的广告对话框(或者您想要看到的任何内容在点击主窗体时消失)将实现此界面:

public interface IVanishingDialog
{
    /// <summary>
    /// Closes the dialog box.
    /// </summary>
    void Vanish();
}

在七点钟上工作就像一个魅力(没有哔哔声)。

我只需要以一种方式改进它: 当用户单击主窗体中的按钮时,广告窗体关闭但未按下按钮。 我必须转换并发送新消息。