每次开机看到360的开机小助手,都非常羡慕,要是自己写一个多好啊。
今天,pearry就带大家来自己动手写开机小助手。
主要知识:
1.获取系统运行时间
涉及的API函数:GetTickCount() //获取系统运行时间(毫秒)
2.计时器
每秒刷新数据。
涉及的API函数:SetTimer、KillTimer
3.获取文件路径
设置开机启动时使用
涉及的API函数: GetCurrentDirectory(); //获取程序的当前目录
4.注册表操作
添加注册表到自动启动项、删除注册表。
涉及的API函数:
打开注册表:RegOpenKeyEx
设置注册表项:RegSetValueEx
删除指定值:RegDeleteValue
了解了这些,我们就可以动手开始编写代码了。
建立MFC项目,我这里叫WinStart。
布置界面,如下图一:
在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("删除失败!"));} }
}
好了,我们的功能就这样基本实现了 ,赶快自己动手试试吧
欢迎拍砖~~~