Form_Closing、Form_Unloadイベントでの例外は全てハンドリングし、終了するようにする。イベントからイベントハンドラを外し終了。出来る?

lxl379386901 2012-03-29 12:33:44
【対応内容】
MainMenuInvoker.Application_ThreadExceptionで、Application.Exitを行っているが、
Form.Closingイベントが発生してしまう為、イベントハンドラを外して終了させるか、
強制終了するように修正する。

求助,怎么去避免事件
...全文
112 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxl379386901 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
本身机制就是这样的,如果你不想触发的话,可以窗体代码里加个全局变量,如
bool isExit = false;

当application.exit();后,
立马写一句isExit =true;

然后再Form1_FormClosing里,
加条if(isExit == false ){..........}
这样,就算因为application.exit();触发了Clos……
[/Quote]

谢谢你的回答,这应该类似在Form1_FormClosing里
//if (e.CloseReason == CloseReason.ApplicationExitCall)
//{
// 。。。
//}
吧,不过如果程序中form窗体很多呢,都去加判断?
lxl379386901 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
LZ 是日本人?
还是LZ把我们当日本人了?
[/Quote]

搞对日外包的也会上这网站
暖枫无敌 2012-03-29
  • 打赏
  • 举报
回复
本身机制就是这样的,如果你不想触发的话,可以窗体代码里加个全局变量,如
bool isExit = false;

当application.exit();后,
立马写一句isExit =true;

然后再Form1_FormClosing里,
加条if(isExit == false ){..........}
这样,就算因为application.exit();触发了Closing事件,
也因为已经isExit= true而不会调用if(isExit == false ){..........}
这个花括号里面的代码了
lxl379386901 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
去问曰本人。
[/Quote]

国内也有很多搞对日外包的,我水平差,问日本人搞不懂。
lxl379386901 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
虫国语言,看不懂,其中只有几个E文认得
[/Quote]

在Application_ThreadException中执行Application.Exit()时,会自动触发FormClosing等事件,不让这些事件执行,直接强制关闭。 该怎么做才好。
threenewbee 2012-03-29
  • 打赏
  • 举报
回复
去问曰本人。
暖枫无敌 2012-03-29
  • 打赏
  • 举报
回复
虫国语言,看不懂,其中只有几个E文认得
qldsrx 2012-03-29
  • 打赏
  • 举报
回复
.NET是安全代码,不支持,要直接关闭程序只能用API,任何.NET代码都无法绕过你所指的事件。

[Flags]
public enum ProcessAccessFlags : uint
{
All = 0x001F0FFF,
Terminate = 0x00000001,
CreateThread = 0x00000002,
VMOperation = 0x00000008,
VMRead = 0x00000010,
VMWrite = 0x00000020,
DupHandle = 0x00000040,
SetInformation = 0x00000200,
QueryInformation = 0x00000400,
Synchronize = 0x00100000
}

[DllImport("kernel32.dll")]
static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, uint dwProcessId);

[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool TerminateProcess(IntPtr hProcess, uint uExitCode);

[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetExitCodeProcess(IntPtr hProcess, out uint lpExitCode);

private void KillProcess(string processId,string processName)
{
IntPtr killer;
try
{
killer = OpenProcess(ProcessAccessFlags.All, false, uint.Parse(processId));
MessageBox.Show(killer.ToString());
uint exitcode = 0;
bool ret = GetExitCodeProcess(killer, out exitcode);
ret = TerminateProcess(killer, exitcode);
if (ret)
MessageBox.Show(string.Format("成功关闭程序{0}。", processName));
else
{
exitcode = 0;
MessageBox.Show(string.Format("杀死进程{0}时失败,原因不明。", processName));
}
}
catch (Exception Exc)
{
MessageBox.Show(string.Format("杀死进程{0}时失败,原因是{1}。", processName, Exc.Message));
}
}

这里KillProcess所传递的参数processId就是Process.GetCurrentProcess().Id.ToString()
lxl379386901 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
给你来个狠的
Process.GetCurrentProcess().Kill()
[/Quote]

哈哈
superliu1122 2012-03-29
  • 打赏
  • 举报
回复
给你来个狠的
Process.GetCurrentProcess().Kill()
lxl379386901 2012-03-29
  • 打赏
  • 举报
回复
也许是我没说清,我这是发生异常时程序强制关闭,等于会将打开的所有窗体都关闭,而有些窗体中Form1_FormClosing里e.Cancel = true;时会有问题,所以我不想经过这些窗体的FormClosing事件,而是强制关闭程序

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧