当用户在窗体窗口外点击时如何关闭窗体?如果用户单击它以外的任何地方,我想关闭System.Windows.Forms.Form。我试过使用IMessageFilter,但即便如此,也没有任何内容传递给PreFilterMessage。如何接收窗体窗口外的点击?在窗体的停用事件中,键入“this.Close()”。只要您单击Windows中的其他任何地方,您的表单就会关闭。更新:我认为你现在拥有的是一个音量按钮,在Click事件中你创建了一个VolumeSlider窗体的实例并通过调用ShowDialog()来显示它,直到用户关闭弹出的窗体。在下一行中,您将读取用户选择的卷并在程序中使用它。没关系,但正如您所注意到的那样,它会强制用户明确关闭弹出窗口以返回主程序。Show()是您真正想在弹出窗体上使用的方法,但Show()不会阻塞,这意味着主窗体上的Click事件在不知道新音量应该是什么的情况下完成。一个简单的解决方案是在主窗体上创建一个公共方法,如下所示:publicvoidSetVolume(intvolume){//对音量做一些事情——无论你之前用它做什么}然后,在点击音量按钮事件(同样在主窗体上),使VolumeSlider显示如下:VolumeSliderslider=newVolumeSlider();滑块显示(这个);//下一步需要“this”在VolumeSlider表单中,当用户使用(我猜)滚动条时,您将这段代码放在滚动条的ValueChanged事件中(我认为它确实如此):MainFormowner=(MainForm)这个。所有者;owner.SetVolume(scrollbar.Value);然后在VolumeSlider表单的Deactivate事件中,您将调用this.Close()如上所述。然后您的表单将按预期运行。感谢这个问题中的p-daddy,我找到了这个允许我使用ShowDialog的解决方案:这个.Capture=true;}protectedoverridevoidOnCaptureChanged(EventArgse){if(!this.Capture){if(!this.RectangleToScreen(this.DisplayRectangle).Contains(Cursor.Position)){this.Close();}else{this.Capture=true;}}根据。OnCaptureChanged(e);我在Simon的解决方案中遇到了Noam描述的相同问题。使用以下代码,我避免了“点击”问题...protectedoverridevoidWndProc(refMessagem){base.WndProc(refm);//如果单击外部对话框->关闭Dlgif(m.Msg==NativeConstants.WM_NCACTIVATE)//0x86{if(this.Visible){if(!this.RectangleToScreen(this.DisplayRectangle).Contains(Cursor.Position))这个.关闭();}}}如果是MDI应用窗体中的child,可以在父窗体中捕获点击,否则解决方法会很乱。我不相信您的建议代表了直观的UI行为。你确定这是最好的设计吗?如果您尝试创建类似于菜单的弹出窗口,但它允许您与控件进行交互,您可以尝试在工具栏下拉列表中托管用户控件。简单方法:在Form1上使用此代码调用form2:PrivateSubButton1_Click(senderAsObject,eAsEventArgs)HandlesButton1.ClickForm2.Owner=MeForm2.Show()EndSub然后在form1上再次使用此代码:PrivateSubForm1_MouseClick(senderAsObject,eAsMouseEventArgs)HandlesMe.MouseClickIfForm2.IsHandleCreated=TrueThenForm2.Close()EndIfEndSub这个很简单:以上就是C#学习教程:当用户点击窗体外的时候window如何关闭窗体?如果分享的内容对你有用,需要了解更多C#学习教程,希望你多多关注——privatevoidbutton1_Click(objectsender,EventArgse){Formf=newForm();f.LostFocus+=newEventHandler(f_LostFocus);f.Show();}voidf_LostFocus(objectsender,EventArgse){Formf=senderasForm;f.关闭();f.处置();如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
