叶进.NET
If you think you can, you can!
博客园
社区
首页
新随笔
管理
订阅
随笔- 73 文章- 0 评论- 408
屏蔽Winform的关闭按钮与“创建窗口句柄时出错”
首先,先介绍下如何屏蔽Winform的关闭按钮,就是在点关闭时,并不是直接关闭程序,而是提示是否真的关闭或者最小化。
前段时间要实现这个功能,所以就在网上搜罗了下。Winform的关闭操作其实是发一个关闭的消息。所以,要想不关闭窗口,只要截获这个消息就可以了。
那么如何截获呢?
可以用WndProc来得到并处理Window系统注销或关闭的消息:
protected
override
void
WndProc(
ref
Message m)
{
const
int
WM_SYSCOMMAND
=
0x0112
;
const
int
SC_CLOSE
=
0xF060
;
if
(m.Msg
==
WM_SYSCOMMAND
&&
(
int
)m.WParam
==
SC_CLOSE)
//
用户点击关闭按钮
{
this
.WindowState
=
FormWindowState.Minimized;
//
最小化
return
;
}
base
.WndProc(
ref
m);
//
调用基类的窗体事件
}
上面的方法就是点击关闭按钮后不退出程序,而是最小化。
另外,也可以用Closeing事件,事件里的参数e有个Cancel,当e.Cancel=true的时候也会不关闭程序及系统(或注销)。
这个方法是满足了我的要求,但是我昨天又想用在另一个Winform程序的时候,把代码添加过去,并做了适当的修改:
protected
override
void
WndProc(
ref
Message m)
{
const
int
WM_SYSCOMMAND
=
0x0112
;
const
int
SC_CLOSE
=
0xF060
;
if
(m.Msg
==
WM_SYSCOMMAND
&&
(
int
)m.WParam
==
SC_CLOSE)
//
用户点击关闭按钮
{
if
(DialogResult.No
==
MessageBox.Show(
"
确定退出?
"
,
"
退出
"
, MessageBoxButtons.YesNo))
{
//
不关闭
return
;
}
}
//
base.WndProc(ref m);
//
调用基类的窗体事件
}
这里我是先提示是否确定要退出程序,如果选是才真的退出,否则不做任何处理。我把最后的一条语句注释掉了。
这时问题就出现了:出现了“创建窗口句柄时出错”的Win32Exception。
后来把baseWndProc(ref m)的注释取消掉,就行了。
具体原因还不清楚,知道的朋友讲解下。
希望,能给有类似困扰的朋友有所帮助。
汇聚杭州外卖:
外卖汇
Tag标签:
C#
,
.net framework
,
.NET
,
C# 2.0
posted @ 2008-04-08 09:28
随风逝去(叶进)
阅读(1936)
评论(18)
编辑
收藏
所属分类:
A. C#.NET
发表评论
回复
引用
查看
#1楼
2008-04-08 09:45 |
ZH-CN
关注~
回复
引用
查看
#2楼
[
楼主
]2008-04-08 09:56 |
随风逝去(叶进)
@ZH-CN
谢谢哦!呵呵
回复
引用
查看
#3楼
2008-04-08 10:11 |
队长
哥们,不加base.WndProc(ref m);的话,窗体就啥消息都处理不了了
这样写比较妥当:
if (m.Msg == WM_SYSCOMMAND && (int)m.WParam == SC_CLOSE)
{
//your code
}
else
{
base.WndProc(ref m);
}
回复
引用
查看
#4楼
[
楼主
]2008-04-08 10:20 |
随风逝去(叶进)
@队长
恩,是的,这样可读性确实好很多。
哦! 明白了!
谢谢队长
回复
引用
查看
#5楼
2008-04-08 10:54 |
天生俪姿
一开始粘的代码似乎见过。
另外说一下。楼主的简介那里好像有点串位了。
回复
引用
查看
#6楼
2008-04-08 10:54 |
天生俪姿
我的分辨率为1024*768
回复
引用
查看
#7楼
2008-04-08 11:04 |
dudu
请调整一下摘要中的图片。
回复
引用
查看
#8楼
2008-04-08 11:09 |
zoti
不是有個事件嗎?
FormClosing
回复
引用
查看
#9楼
[
楼主
]2008-04-08 11:13 |
随风逝去(叶进)
@天生俪姿
@dudu
把摘要中的图片去掉了!
回复
引用
查看
#10楼
[
楼主
]2008-04-08 11:14 |
随风逝去(叶进)
@zoti
是可以设置FormClosing事件中的e.Cancel=true
回复
引用
#11楼
2008-04-08 11:27 |
Gavin Lv [未注册用户]
不用这么复杂吧,我一般是在Closing中判断Environment.HasShutdownStarted
protected overrides void OnClosing(EventArgs e)
{
if (!Environment.HasShutdownStarted)
{
e.Cancel = true;
this.WindowState = FormWindowState.Minimized;
}
}
回复
引用
查看
#12楼
2008-04-08 11:33 |
王孟军!
关注...
回复
引用
查看
#13楼
2008-04-08 11:35 |
飞无痕落无声
--引用--------------------------------------------------
Gavin Lv: 不用这么复杂吧,我一般是在Closing中判断Environment.HasShutdownStarted
protected overrides void OnClosing(EventArgs e)
{
if (!Environment.HasShutdownStarted)
{
e.Cancel = true;
this.WindowState = FormWindowState.Minimized;
}
}
--------------------------------------------------------
楼主的方法是揭示了关闭事件的真相,你那样用法虽然简单,但是却被MICROSOFT给蒙蔽了。
回复
引用
查看
#14楼
2008-04-08 13:44 |
winkingzhang
-------------------------------
后来把base.WndProc(ref m)的注释取消掉,就行了。
具体原因还不清楚,知道的朋友讲解下。
-------------------------------
这里WndProc是Windows消息处理函数,lz不调base的话,所有的消息到这里就不会处理,当然这里有些是可以不处理的,但是WM_CREATE和WM_NCCREATE是必须传给系统处理的,否则窗体时不能创建出来的。
回复
引用
查看
#15楼
[
楼主
]2008-04-08 15:11 |
随风逝去(叶进)
@winkingzhang
是的! 谢谢你!
回复
引用
查看
#16楼
2008-04-08 18:01 |
Ryan Yu
感谢楼主分享:)
回复
引用
查看
#17楼
2008-04-09 10:12 |
阿鸟
......哪那么麻烦咯....
回复
引用
查看
#18楼
[
楼主
]
2008-04-09 10:43 |
随风逝去(叶进)
@阿鸟
是的! 可以设置FormClosing事件中的e.Cancel=true来取消关闭操作!
社区
新闻
新用户注册
刷新评论列表
标题
姓名
主页
Email
(只有博主才能看到)
验证码
*
看不清,换一张
[
登录
][
注册
]
内容(请不要发表任何与政治相关的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
该文被作者在 2008-04-08 11:13 编辑过
另存
打印
所属分类的其他文章:
·
【C#食谱】【面食】菜单7:用默认值初始化泛型变量
·
类和对象
·
C#Winform下用正则表达式限制TextBox只能输入数字
·
【C#食谱】【川菜】菜单1:列出被引用的程序集
·
屏蔽Winform的关闭按钮与“创建窗口句柄时出错”
·
从C#2.0的角度看.NET 2.0类型系统
·
了解 .NET Framework 3.0
·
【C#食谱】【面食】菜单6:泛型约束
·
轻松得到适用于C# ADO.NET的各种数据库连接字符串
·
【C#食谱】【面食】菜单5:用泛型副本替换哈希表
最新IT新闻:
·
奥运核心资源被分食 搜狐央视网谁忽悠谁?
·
微软推新型搜索技术"BrowseRank"挑战谷歌
·
2008年7月26日IT博客精选
·
微软每年向Apache捐10万美元支持开源软件
·
AOL将关闭3个网站以降低成本 集中发力广告
博客园新闻频道
博客园首页
社区
公告
MSN
:
adaiye@hotmail.com
From 2008.3.22
I have read:
I am reading......:
C#和.NET 2.0实战 平台、语言与框架
修改代码的艺术
跟小D每日学口语
IT新闻:
我的最新闪存
热
7-25 09:25
与我联系
发短消息
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
我的参与
最新评论
我的标签
留言簿
给我留言
查看留言
我管理的小组
杭州.Net俱乐部
机器人的世界
我参加的小组
每日一句英语
博客园发展小组
LumaQQ.NET
Web技术联盟
ASP.NET
创业交流
WinForms
读书(Books)
书籍推荐
Debug 探索团队小组
我参与的团队
应届毕业生之家(0/1138)
杭州.Net俱乐部(0/414)
CLR基础研究团队(0/359)
Debug 探索团队(0/46)
WCF技术研究团队(0/122)
我的标签
C#(10)
需求工程(10)
软件工程(10)
.NET(9)
泛型(6)
C# 2.0(3)
.net framework(2)
TCP(2)
Regular(1)
正则表达式(1)
随笔分类
(70)
A. C#.NET(31)
(rss)
B. 个人翻译(18)
(rss)
C. 软件工程(12)
(rss)
D. 管理
(rss)
E. 读书札记(8)
(rss)
F. 数据库
(rss)
G. 设计模式(1)
(rss)
收藏夹
(99)
C#(51)
(rss)
Design Pattern(5)
(rss)
Linq(2)
(rss)
OO(4)
(rss)
PM(5)
(rss)
WCF(3)
(rss)
机器人(9)
(rss)
敏捷开发(1)
(rss)
其他(5)
(rss)
委托 事件(4)
(rss)
未分类(10)
(rss)
Blogs
anyTao
No完成
supper3000
(rss)
亚历山大
好吃的
外卖汇|杭州外卖
汇聚杭州的大部分外卖信息
最新随笔
1. 【C#食谱】【面食】菜单7:用默认值初始化泛型变量
2. 类和对象
3. 【C#食谱】【杭帮菜】菜单2:写一个TCP客户端
4. C#Winform下用正则表达式限制TextBox只能输入数字
5. 【C#食谱】【杭帮菜】菜单1:写一个TCP服务端
6. 【C#食谱】【川菜】菜单1:列出被引用的程序集
7. 实现需求工程的成功方法
8. 实现需求工程的成功方法——难度:高;影响:低
9. 实现需求工程的成功方法——难度:中;影响:低
10. 实现需求工程的成功方法——难度:低;影响:低
11. 实现需求工程的成功方法——难度:高;影响:中
12. 实现需求工程的成功方法——难度:中;影响:中
13. 实现需求工程的成功方法——难度:低;影响:中
14. 实现需求工程的成功方法——难度:高;影响:高
15. 实现需求工程的成功方法——难度:中;影响:高
积分与排名
积分 - 91444
排名 - 401
最新评论
1. re: 类和对象
good (Tony Zhou)
2. re: 【C#食谱】【面食】菜单4:List和LinkedList性能比较
学习了,讲得真好哈。 (Windie Chai(笑煞天))
阅读排行榜
1. 面试的时候问的一些问题(4233)
2. 配置VS2005,通过NetMassDownloader批量下载和使用源代码(2990)
评论排行榜
1. 面试的时候问的一些问题(96)
Free Web Counter