Windows定时关机程序的开发随笔与经验杂谈(TimeSwitch)

今天上课学了个叫DateTimePicker的控件,突然想到以前用C#写过的一个设定自动关机的程序,遗憾的是那个程序一直没能拥有通过“设定关机日期/时间”初始化倒计时程序的功能,那么今天是不是就可以实现了呢?我想应该没什么问题吧,于是中午放学后我就泡在了电脑前,打开VC++6.0开始写这个程序。

 

【一期开发】

 

以下是我碰到的一些问题:

1. 我使用两个DateTimePicker控件,一个用来读用户设定的日期,另一个读时间,第一个问题就是如何才能将他们组合起来使用?我的做法是初始化apttime(指定时间)时,分别采用两个DateTimePicker控件的有效数值部分。即读日期的那个控件取它的年/月/日,读时间的控件取它的时/分/秒,这样有了年/月/日/时/分/秒就可以初始化新的CTime对象apttime了。

2. 两个CTime对象可以直接相减,但减完的结果是CTimeSpan的对象,如果想得到两个CTime对象之间相差的秒数,可以使用CTimeSpan成员方法GetTotalSecond();另外关于time_t与CTime之间的关系,查看time.h可知time_t实际上就是long,事实上它保存的是当前时间与1970年1月1日0时0分0秒之间的秒数差。

CTime对象转换为time_t的方法:

- 调用CTime成员函数GetTime: time_t GetTime() const;  详查MSDN..

time_t转换为CTime对象的方法:

- 调用CTime的一种构造函数: CTime(time_t time);  详查MSDN..

3. 要在对话框上设置两组RadioButton(单选按钮),但软件调试时发现所有的单选按钮变成了一个大组(即使是将他们用GroupBox隔开),这背离了我们的本意,解决这个问题最好的方法就是将每组RadioButton的第一个按钮的Group属性选中;

4. 为了方便调节文本框中的数值,可以为每个文本框添加Spin(旋转按钮)控件,但是简单的添加Spin控件并不能达到我们的目的,正确的做法是在对话框编辑页面按Ctrl+D快捷键,调出Tab Order功能,依次点击页面上的控件使标号改变,只需要将Spin控件的Tab顺序调整到其对应的文本框控件之后即可,例如一个文本框控件的Tab顺序号为6,那么他会跟Tab顺序号为7的Spin控件绑定!当然在Spin控件的属性中,还需要选中Auto buddy属性, 为了使界面美观,还可以更该Alignment属性为Right,这样Spin控件就会吸附在EditBox控件右边,就好像是一个控件!当然,如果希望点击Spin控件上的按钮实现文本框中的数字+1或-1,那么最简单的方法就是选中Spin控件属性中的Set buddy integer。最后还要注意,Spin默认的数值范围是0~100,点击下(右)按钮则增加伙伴控件中的数值,点击上(左)按钮则减少它,这与我们通常的习惯正好相反,解决的方法就是通过CSpinButtonCtrl::SetRange()函数设置正确的数值范围即可!

解决了上述问题,再配合MSDN,很快就能够完成此程序的第一个版本:我是通过system()函数调用XP系统自带的shutdown.exe解决倒计时关机问题的,说白了刚才做的工作只是一个外壳,方便用户使用shutdown命令的Shell而已,它能通过友好的用户界面将使用者的意图转换为准确合理的参数,提供给shutdown程序接收。

当然使用system()函数也存在着一些弊端,比如调用命令的时候会出现黑色的命令提示符窗口;另外这种方案本身也具有很大的局限性,由于XP与Vista系统下shutdown命令的用法与格式有较大不同,因此目前这个版本的软件只能在XP系统中使用!

 

TimeSwitch_V0.1_BETA

 TimeSwitch_V0.1_BETA

 

【二期开发】

对于V0.1版本中存在的诸多缺点,此次开发的新版本将加以改进!首先,我打算让软件脱离对系统自带的关机程序shutdown.exe的依赖,其次软件的外观以及关于界面的信息也需要做一些调整,完成后将直接发布V1.0Final版。

说做就做,我动手查了一下Windows用于关机的函数,发现有这么几个函数:

AbortSystemShutdown

ExitWindows

ExitWindowsEx

InitiateSystemShutdown

LockWorkStation

我最开始的尝试是InitiateSystemShutdown,因为感觉它就是shutdown.exe调用的函数,随后我也印证了自己的想法,用这个函数成功设计出了V1.0Final,初步达到了目的(摆脱了黑色的命令提示符窗口,并且也不再依赖于系统自带的shutdown.exe),虽然说只是动手改了改代码,但是还是遇到了问题:

主要是在调用InitiateSystemShutdown()函数时总是返回FALSE,于是我就调用GetLastError()查询错误代码,根据MSDN所示,这个错误是“Access is denied.(拒绝访问)”,会不会是因为权限不够呢?即使是我以管理员身份登录,系统也会自动为进程设置默认的安全级别?带着这些疑问我上网搜寻答案,结果正如我所料,确实是我的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值