C# 检测父窗体中但子窗体外部的鼠标单击

C# 检测父窗体中但子窗体外部的鼠标单击,c#,winforms,C#,Winforms,我试图实现一个UI,父窗体通过showDialog()加载子窗体。每当我单击子窗体外部但在父窗体内部的任何位置时,子窗体都将关闭。单击父窗体之外的任何位置只会导致正常的“alt tab”操作。如何执行此操作?如果表单中没有任何控件(例如,如果您正在查看图片)。然后您可以捕获鼠标: protected override void OnLoad( EventArgs e ) { base.OnLoad( e ); this.Capture = true

我试图实现一个UI,父窗体通过showDialog()加载子窗体。每当我单击子窗体外部但在父窗体内部的任何位置时,子窗体都将关闭。单击父窗体之外的任何位置只会导致正常的“alt tab”操作。如何执行此操作?

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

    protected override void OnLoad( EventArgs e )
    {
        base.OnLoad( e );
        this.Capture = true;
    }
然后,如果点击超出了表单范围,您只需签入OnMouseDown

除此之外,可以使用以下代码:


它在Windows XP中工作得很好,但在Windows 7中也会发出嘟嘟声,我还没有调查原因。

我需要同样的行为

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

根据信息,这里是我的解决方案(以主要形式):

我的广告对话框(或任何你想在点击主窗体后消失的内容)将实现此界面:

public interface IVanishingDialog
{
    /// <summary>
    /// Closes the dialog box.
    /// </summary>
    void Vanish();
}
公共界面伊万对话框
{
/// 
///关闭对话框。
/// 
空洞消失();
}
在七点时像个魔咒一样工作(没有嘟嘟声)

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

这基本上无法工作,在显示对话框时,父窗体被禁用。它无法接收任何输入事件,Windows只会提示您。您必须放弃使用ShowDialog()的想法。Show()和表单的Deactivate event.hmmm在其他方面都很简单,Show()和Deactivate事件都可以使用,但对于正常的alt tab事件,表单也将停用。如何设置它,使其仅在“焦点”更改为父窗体时消失?然后改用该窗体的激活事件。+1-如果有人知道Win7的蜂鸣音修复,请在此处共享它?顺便说一句,我应该停止使用singleton模式。
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();
}