当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 用vc.net实现记录开关机时间的程序

VC++
一个 C++ 日期类(第二部分)
一个 C++ 日期类(第一部分)
简单快速的哈夫曼编码
URL编码
一道 Google 竞赛题的解法
模拟退火算法求解TSP问题
任意分布的随机数的产生方法—VC程序实现方法
写个过河算法
PL/0语言词法及语法分析系统的设计与实现
九宫问题(八数码)求解过程动态演示
N皇后问题摆法算法描述
实现LZARI压缩算法的C++类
一种快速可预制的随机数组产生方法
利用SDK实现迷宫算法
猫吃老鼠的系统化算法
C-编译器的设计
与/或表达式化简
启程动态数组V2.0
全文信息检索介绍及算法分析
CRC算法与实现

VC++ 中的 用vc.net实现记录开关机时间的程序


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 92 ::
收藏到网摘: n/a

用vc.net实现记录开关机时间的程序


作者:西安 汪俊


下载源代码


    虽然现在电脑大幅降价,但是多人公用一台电脑的情况仍然不少,特别是学生一族。有时候自己由于某种需要要知道别人什么时候使用这台电脑,那该怎么办呢?去网上找一个?但是不一定符合自己的要求,不如发扬DIY精神,自己做一个。那么就用vc.net来DIY一个吧。
    编程思想:记录开机时间比较容易,只需要让程序随系统启动,启动时记录一个开机时间,关机时记录关机时间就可以了。
    在正式开始之前,首先得了解这个小程序的编写步骤,让我们一步一步来:

  1. 实现开机自运行
  2. 实现运行时自动隐藏
  3. 实现可以热键呼出
  4. 实现记录时间
  5. 实现关机时记录时间

1、实现开机自运行

    我在csdn网站上经常看到有人问这样的问题,其实要实现开机时就自动运行自己的程序并不难。在注册表的HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run键下可以看到有一系列键值,它们都是开机自动运行的软件的路径。那么我们要做的就是编程实现将我们的程序的路径也添加到这个键值下,就搞定了。著名的“windows优化大师”也就是用去掉不必要的开机运行软件这个方法来实现开机速度优化的。
    既然要读写注册表,就要用到两个重要的操作注册表的函数:RegOpenKey()和RegSetValueEx()。前者用于打开注册表的键,后者则为打开的键设置键值,至于这两个API函数的具体参数,请参见MSDN。为了代码重用的要求,我为此封装了一个专门的函数,如下所示:

BOOL SetAutoRun(CString strPath)//开机自动运行{ CString str; HKEY hRegKey; BOOL bResult; str=_T("Software\\Microsoft\\Windows\\CurrentVersion\\Run"); if(RegOpenKey(HKEY_LOCAL_MACHINE, str, &hRegKey) != ERROR_SUCCESS) bResult=FALSE; else { _splitpath(strPath.GetBuffer(0),NULL,NULL,str.GetBufferSetLength(MAX_PATH+1),NULL); strPath.ReleaseBuffer(); str.ReleaseBuffer(); if(::RegSetValueEx( hRegKey, str, 0, REG_SZ, (CONST BYTE *)strPath.GetBuffer(0), strPath.GetLength() ) != ERROR_SUCCESS) bResult=FALSE; else bResult=TRUE; strPath.ReleaseBuffer(); } return bResult;}	

    其中strPath参数表示要设置为自运行的程序的绝对路径。当设置成功时返回true,否则返回false。
这里又带来一个问题:既然需要本程序的绝对路径,那么怎么得到它呢?总不能指定一个值吧,那么当本程序的路径改变时就又要修改程序,太麻烦了。可以用这个封装的函数来实现:
//得到程序文件本身的路径(包括文件名)

CString GetMyPath(){ CString strPath; GetModuleFileName(NULL,strPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH); strPath.ReleaseBuffer(); return strPath;}

    其中GetModuleFileName()是一个得到路径的API函数。本函数将这个API函数封装在其中,为的是简化调用的目的。
    当执行这个函数时,返回本程序所在的绝对路径,包括本程序的文件名。
好了,得到本程序的路径,然后将它加载到注册表中,下次系统启动时,我们的程序就能自动随之启动了。

2、实现运行时自动隐藏

   这是一个很有趣很古老的话题,csdn上经常有人为此讨论不休,提出不少方案,比如在对话框的OnInitDialog()中添加一句:ShowWindow(SW_HIDE);,或者在对话框属性框中去掉对话框的Visible属性;或者将对话框移到桌面以外的地方去;或者首先将对话框最小化,然后实现最小化时隐藏……有趣的是这些很容易想到的常规方法都不能解决这个问题,或者说解决的不够好。我通过查找相关文章和多次修改代码,找出了真正解决这个问题的办法。
   之所以用ShowWindow()函数失效,我认为可能是对话框的DoModal