我有一个在系统托盘图标中运行的Windows窗体应用程序.如果用户按下窗口的X按钮,将显示一个消息框,显示是和否(是 - >关闭窗体---否 - >保持窗体运行在系统托盘图标).我正在考虑在用户打开另一个应用程序实例时阻止该场景,因为我已经运行了一个实例,所以我使用了这段代码:
If Process.GetProcessesByName(Process.GetCurrentProcess.ProcessName).Length> 1 Then
MessageBox.Show("Another instance is running", "Error Window", MessageBoxButtons.OK,
MessageBoxIcon.Exclamation)
Application.Exit()
End If
Run Code Online (Sandbox Code Playgroud)
问题是,当我想测试这个消息时,但是在我按下确定后,会出现一个新的消息框(来自Private Sub Form_FormClosing的消息框).如果我选择NO,我将不得不运行实例!我已经读过Application.Exit会触发Form_FormClosing事件.
是否有可能取消触发Form_FormClosing事件,或者我做错了什么?
'这是封闭程序
Private Sub Form_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
Try
Dim response As MsgBoxResult
response = MsgBox("Are you sure you want to exit", CType(MsgBoxStyle.Question + MsgBoxStyle.YesNo, MsgBoxStyle), "Confirm")
'If the user press Yes the application wil close
'because the application remains in taskmanager after closing i decide to kill the current process …Run Code Online (Sandbox Code Playgroud) 如何在C#中使用unclosed应用程序?我想禁用表单的"X"按钮,并阻止Windows任务管理器关闭它.
我知道阻止表单关闭的一种方法是处理FormClosing事件,但是如何阻止任务管理器关闭它?
在vb.net中有没有办法暂停一个函数\事件并等到另一个表单关闭到contine
例:
Private Sub B1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles B1.Click
label1.text="Hello testing.." '1st function
form2.show() '2nd function
'MAKE FORM WAIT FOR FORM 2 TO CLOSE...
'THEN CONTINUE WITH THE NEXT FUNCTION
msgbox("Some function that was waiting in the event") '3rd function
end sub
Run Code Online (Sandbox Code Playgroud)
我能找到的最接近我想要的是一个输入框,但输入框受限于我想要的,虽然它等待,因为我希望Form2能够运行.
另一个建议是循环,直到form2关闭,但这是一个hacky和unprofesional作为解决方案(我的意见)
这与如何禁用Alt + F4结束表格不重复?.请阅读原因.
我在我的主表单下创建了一个自定义MessageBox.
并将"Aight"按钮单击监听器设置为:
private void Aight_buton_Click(object sender, EventArgs e)
{
dr = DialogResult.OK;
Close();
}
Run Code Online (Sandbox Code Playgroud)
"X"按钮的情况也是如此.按照上面的问题回答我可以做到这一点:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = e.CloseReason == CloseReason.UserClosing;
}
Run Code Online (Sandbox Code Playgroud)
但是因为我Close()在Aight_buton_Click它下面使用它仍然注册为e.CloseReason == CloseReason.UserClosing;.所以按键不会关闭我的表单(自定义消息框)也不会Alt+ F4.我想知道具体如何我只能阻止Alt+ F4关闭而不是Close()关闭.请不要使用,ModifierKeys因为它不是最合适的,也不是处理这种情况的最聪明的方法.
这个问题可能看似重复,但我在测试程序时遇到了这个问题,我对你如何解决它感到困惑.
我有一个winform,它有一个表单结束事件.在这种情况下,我弹出一个消息框,询问用户"你确定要关闭窗口吗?" 如果他们按下"是"按钮,应用程序将关闭窗口并阻止其按预期处理.所以,我可以再打开它.但是,如果他们没有按下任何按钮,它仍会关闭窗口,但现在窗户已被丢弃.因此,当我尝试再次打开它时,它引发了一个异常,"无法访问已处置的对象".当没有按下按钮时,我希望winform保持打开状态而不是处理掉.
这是我的代码:
method PPMain.PPMain_FormClosing(sender: System.Object; e: System.Windows.Forms.FormClosingEventArgs);
begin
if MessageBox.Show('Are you sure you want to close the window?','PPMain',MessageBoxButtons.YesNo) = DialogResult.Yes then
begin
e.Cancel := true;
Hide;
end
else
e.Cancel := false;
end;
Run Code Online (Sandbox Code Playgroud)
我想,因为你必须设置e.Cancel = true来关闭窗口并告诉它隐藏,做相反的事情(e.Cancel = false并且没有隐藏)将阻止winform关闭和被处理.
你是如何解决这个问题的?
预先感谢,
我有一个带有ID Form1的winform,在这个表单中我使用ID Form2创建另一个表单的新对象并显示它:
Form1中的代码:
Form2 f2 = new Form2();
f2.show();
Run Code Online (Sandbox Code Playgroud)
我想在用户f2关闭时在Form1中运行一些代码:
请帮我.
我正在研究具有多种形式的C#应用程序.
当我打开其中一个表单时,我添加了一个这样的事件监听器:SomeClass.MotionCompleted += new EventHandler(HandlerMethod);.MotionCompleted事件是一个静态事件.
我注意到,在关闭此表单后,HandlerMethod仍会在事件发生时被调用,然后导致异常,因为它试图更新表单上不再存在的内容.
eventlistener如何存在并响应事件,即使表单不再存在?一旦调用了form.Close()或this.Close(),就不应该自动取消挂钩事件列表器,以便它们不再被调用?
搜索谷歌和stackoverflow之后我无法找到一个帮助我在我的情况下的答案.我有一个带有开始菜单(表单)的应用程序.当用户按下(任意)表格的X(关闭)时,我重新加载开始菜单.现在,当(菜单)表单关闭时,我想检查并通知用户现在任何隐藏的表单处于编辑模式(有或没有未保存的更改),如果用户按下取消我想显示该表单并停止应用程序关闭.现在我的问题是如何阻止应用程序停止在其他表单的代码中.我有一个覆盖调用this.close的子窗体的dispose方法,所以ok/cancel消息框显示但是在MB之后,开始菜单关闭,无论如何停止程序.我应该寻找一种处理这些东西的不同方法,还是要修改方法或事件处理程序,以便这个/ \可以工作?
编辑:确定这里的代码部分是被调用的顺序.我哪里出错了?
private void Menu_FormClosing(object sender, FormClosingEventArgs e)
{
Global.Forms.Remove(this);
if (!Global.Clean_Forms())
{
e.Cancel = true;
Global.Forms.Add(this);
}
}
public static void Clean_Forms()
{
foreach (Form f in Forms)
{
if (f is Menu)
{
//do nothing
}
else
{
if (!f.IsDisposed)
{
f.Close();
}
}
}
if (Forms.Count != 0)
{
isClean = false;
/* String a = "";
foreach (Form f in Forms)
{
a += f.ToString() + ": ";
}
MessageBox.Show(a);*/
}
else
{
isClean = …Run Code Online (Sandbox Code Playgroud) 我找到了这个:
其中说我应该使用FormClosing事件找出窗口因为点击X而关闭的时间.
但我的事件代码永远不会被调用:
private void MainWin_FormClosing(Object sender, FormClosingEventArgs e)
{
m_closeThread = true;
Application.Exit();
}
Run Code Online (Sandbox Code Playgroud)
我必须遗漏一些基本的东西,但我不知道是什么.
我有一个 WPF UserControl,它托管在 WPF 窗口或 Windows Forms 中Form。当用户按下“X”按钮关闭托管窗口/表单时,我想捕获此关闭事件并执行一些操作。
为此,我订阅了加载事件以UserControl获取托管窗口/表单实例并订阅其关闭事件。
它在 WPF 窗口中工作正常,但当我尝试对 执行相同操作时Form,出现错误并且无法继续。
WPFUsercontrol.xaml.cs
private void WpfUsercontrol_OnLoaded(object sender, RoutedEventArgs e)
{
Window window = Window.GetWindow(this);
if (window != null)
window.Closing += window_closing;
Form form = this.Parent as Form;
//Error: Cannot convert from System.Windows.DependencyObject to System.Windows.Forms.Form
}
Run Code Online (Sandbox Code Playgroud)
如何实现Form与使用 WPF 窗口相同的关闭 a 的功能?
formclosing ×10
winforms ×8
c# ×7
.net ×4
vb.net ×2
delphi-prism ×1
forms ×1
messagebox ×1
oxygene ×1
wait ×1
wpf ×1