在父窗体中检测到鼠标单击,但在子窗体之外

本文关键字:窗体 鼠标 检测 单击 | 更新日期: 2023-09-27 18:17:26

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

在父窗体中检测到鼠标单击,但在子窗体之外

如果窗体中没有任何控件(例如,如果您正在查看图片)。然后你可以直接捕获鼠标:

    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中也会发出哔哔声,我还没有调查原因。

我需要同样的行为。

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

基于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();
}

像魅力一样工作七(没有哔哔声)。

我只需要在一个方面改进它:当用户点击主表单中的按钮时,广告表单关闭,但按钮没有被按下。我必须转换并发送一个新消息