每次开机看到360的开机小助手,都非常羡慕,要是自己写一个多好啊。

今天,pearry就带大家来自己动手写开机小助手。

主要知识:

1.获取系统运行时间

涉及的API函数:GetTickCount() //获取系统运行时间(毫秒)

2.计时器

每秒刷新数据。

涉及的API函数:SetTimer、KillTimer

3.获取文件路径

设置开机启动时使用

涉及的API函数: GetCurrentDirectory(); //获取程序的当前目录

4.注册表操作

添加注册表到自动启动项、删除注册表。

涉及的API函数:

打开注册表:RegOpenKeyEx

设置注册表项:RegSetValueEx

删除指定值:RegDeleteValue

了解了这些,我们就可以动手开始编写代码了。

建立MFC项目,我这里叫WinStart。

布置界面,如下图一:

自制360开机小助手-编程知识网

在WinStartDlg.h中添加函数声明void GetTimer(); //用来获取运行时间

在CPP文件中实现:

voidCWinStartDlg::GetTimer()
{CString s;DWORDk=::GetTickCount();//获取毫秒级数目inthm=k/3600000;//hm为小时数intms=(k-3600000*hm)/60000;//ms为分钟数intse=(k-3600000*hm-60000*ms)/1000;//se为秒数(除以1000是因为k精确到毫秒)   s.Format("%d:%d:%d",hm,ms,se);//输出时、分、秒const char* ch = (LPCTSTR)s;SetDlgItemText(IDC_EDIT1,ch);
}

 

在初始化函数BOOL CWinStartDlg::OnInitDialog()中添加计时器:

 

this->SetTimer(0,1000,NULL);

 

然后用类向导建立消息响应函数OnTimer来响应SetTimer发出的WM_TIMER:

voidCWinStartDlg::OnTimer(UINTnIDEvent) 
{
// TODO: Add your message handler code here and/or call defaultGetTimer();CDialog::OnTimer(nIDEvent);
}

 

在OnCancel中KillTimer:

voidCWinStartDlg::OnCancel() 
{
// TODO: Add extra cleanup herethis->KillTimer(0); CDialog::OnCancel();
}

这样,一个基本的程序就做好了。下面我们来导入注册表,设置它为开机启动。

首先我们来获取当前程序路径,放到“导入注册表”按钮中实现:

charpBuf[MAX_PATH];       //存放路径的变量
GetCurrentDirectory(MAX_PATH,pBuf);    //获取程序的当前目录
strcat(pBuf,"\\");
strcat(pBuf,AfxGetApp()->m_pszExeName);   
strcat(pBuf,".exe");

然后,开始注册表操作,首先在指定项下创建一个键值:

HKEY hKey;
//添加注册表,并且打开
RegCreateKey(HKEY_LOCAL_MACHINE,
"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",
&hKey);  
//设置值  
inttemp = RegSetValueEx(hKey,_T("WinStart"), 0,REG_SZ, _T((unsignedchar*)ch),strlen(ch) );
if(temp == 0)
{MessageBox(_T("导入注册表成功!"));RegCloseKey(hKey);
}
else
{MessageBox(_T("导入失败!"));
}

这样我们导入功能就实现了。接下来我们来完成“删除注册表”按钮:

void CWinStartDlg::OnButton2() 
{
// TODO: Add your control notification handler code here
HKEY hKey;
//打开注册表
if(ERROR_SUCCESS !=RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_SET_VALUE ,&hKey))
{MessageBox(_T("打开注册表失败,或不存在该项!"));
}
else
{if(!RegDeleteValue(hKey,"WinStart")){MessageBox(_T("删除注册表成功!"));RegCloseKey(hKey);}else{MessageBox(_T("删除失败!"));}    }
}

好了,我们的功能就这样基本实现了 ,赶快自己动手试试吧

欢迎拍砖~~~