如何在Form的Closing事件中判断是程序关闭还是系统关闭?
如果是系统关闭,我就不阻止Closing事件,如果是手工关闭,则需要阻止Closing事件.
现在我的问题是如何判断这个关闭事件是由谁引起的?
谢谢~~~~
问题点数:20、回复次数:10Top
1 楼SqlDataAdapter(咸蛋超人)回复于 2005-12-12 08:59:49 得分 0
应该实现不了,系统关闭和程序关闭也是向窗口发送关闭窗口的消息,窗口接收消息进行处理。
Top
2 楼software_lin(田野)回复于 2005-12-12 10:03:14 得分 0
加个全局变量区分一下。Top
3 楼CloneCenter(复制中心)回复于 2005-12-12 10:14:46 得分 0
应该是区分不了的,可以自己用自己的程序关闭系统啊。Top
4 楼wuyazhe(wyz&xyl)回复于 2005-12-12 11:03:33 得分 0
关闭windows的时候。回发送给当前每个进程WM_QUERYENDSESSION消息,都返回True,才会关闭windows。你可以拦截这个消息。Top
5 楼sz_lgp(longguoping)回复于 2005-12-12 11:03:38 得分 0
form.closing只对form有效,对程序和系统要分开对待。Top
6 楼wuyazhe(wyz&xyl)回复于 2005-12-12 11:04:58 得分 0
如果上面消息被用户返回True,允许了。还可以拦截
WM_ENDSESSION
用来写保存的代码。保存后回退出系统。Top
7 楼wuyazhe(wyz&xyl)回复于 2005-12-12 11:38:31 得分 0
程序里加入这个
public const WM_QUERYENDSESSION as integer = &H11
protected overrides Sub WndProc(byref m as Message)
{
if m.Msg == WM_QUERYENDSESSION then
MessageBox.Show("Catch it.")
m.Result = new IntPtr(0)
else
mybase.WndProc (ref m);
end if
}Top
8 楼wuyazhe(wyz&xyl)回复于 2005-12-12 11:39:16 得分 20
public const WM_QUERYENDSESSION as integer = &H11
protected overrides Sub WndProc(byref m as Message)
if m.Msg == WM_QUERYENDSESSION then
MessageBox.Show("Catch it.")
m.Result = new IntPtr(0)
else
mybase.WndProc (ref m);
end if
end subTop
9 楼liuyuan_zy(网络蚂蚁)回复于 2005-12-12 15:47:42 得分 0
多谢多谢,昨天我用了这个方法,苦于没有找到这个消息值,现在被你直接给出来了,我一下就解决了,呵呵,多谢,顺便把我按照你的方法修改过后的代码附上,供大家参考一下:
----------------------------------------------------------------------
Dim blnSystemClose As Boolean = False
Protected Overrides Sub WndProc(ByRef m As Message)
If m.Msg = &H11 Then blnSystemClose = True
MyBase.WndProc(m)
End Sub
Private Sub Form1_Closing(ByVal sender As Object, ByVal e As _
System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
If Not blnSystemClose Then
MessageBox.Show("本系统不允许关闭")
e.Cancel = True
End If
End Sub
----------------------------------------------------------------------
Top
10 楼liuyuan_zy(网络蚂蚁)回复于 2005-12-12 15:54:17 得分 0
wuyazhe(我的宝贝叫阿刺) ,能给我你的QQ号吗?以后有问题的话可能还需要向你请教哦,谢谢.
我的QQ号是10531292Top




