开机自启动功能,修改注册表即可。
void CMainFrame::AutoStart()
{
HKEY hkResult;
TCHAR lpFilename[MAX_PATH]="Tianzimk.exe";
GetModuleFileName(NULL,lpFilename,MAX_PATH);//获取程序绝对路径.
LPCSTR regname="Software\\Microsoft\\Windows\\CurrentVersion\\Run";
int ret=RegOpenKey(HKEY_LOCAL_MACHINE,regname,&hkResult);//创建注册表的键
if(ret != ERROR_SUCCESS)
{
WriteLog("注册失败,程序无法加入启动项!");
AfxMessageBox(TEXT("无法加入启动项"));
return;
}
ret=RegSetValue(hkResult,"Tianzimk.exe",0,REG_SZ,(unsigned char*)lpFilename,sizeof(lpFilename));
if(ret==0)
{
RegCloseKey(hkResult);//关闭句柄
WriteLog("程序开机自启动已经成功注册!");
}
else
{
RegCloseKey(hkResult);
CString strError;
strError.Format("RegSetValue执行失败,错误码: %d",ret);
WriteLog(strError);
}
}
创建进程并启动:
UINT CMainFrame::WatchThread(LPVOID pParam)
{
CMainFrame *pMain=(CMainFrame *)AfxGetApp()->m_pMainWnd;
TCHAR szPath[MAX_PATH];
CString strExeFilePath;
GetModuleFileName(NULL,szPath,MAX_PATH);
CString strPath = szPath;
int nPos = strPath.ReverseFind(_T('\\'));
CString strBaseDir = strPath.Left(nPos);
strExeFilePath.Format(_T("%s\\shufeng555.exe"),strBaseDir);
/
CString strIniFilePath;
strIniFilePath.Format(_T("%s\\Tianzimk.ini"),strBaseDir);
STARTUPINFO si;
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION ));
CTime tNow0=CTime::GetCurrentTime();
do
{
CTVMSIniFile ini(strIniFilePath);
CString username=ini.ReadString("","Username","admin");
CString password=ini.ReadString("","Password","12345");
CString strAutoLogin;
strAutoLogin.Format(" -u %s -p %s",username,password);
CString strCmdLine=strExeFilePath+strAutoLogin;
if(!CreateProcess(NULL,(LPTSTR)(LPCTSTR)strCmdLine,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
// if(!CreateProcess(NULL,(LPTSTR)(LPCTSTR)strExeFilePath,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
{
int errorId=GetLastError();
CString errorStr;
errorStr.Format("创建进程失败,错误码: %d",errorId);
pMain->WriteLog(errorStr);
AfxMessageBox(errorStr);
pMain->SendMessage(WM_CLOSE,0,0);
return 0;
}
WaitForSingleObject( pi.hProcess, INFINITE);//检测进程是否停止
CTime tNow1=CTime::GetCurrentTime(); ///当前时间
CTimeSpan span=tNow1-tNow0;
if(span.GetSeconds()>30)
{
pMain->WriteLog("登录失败,请检查文件中的用户名或密码!");
pMain->SendMessage(WM_CLOSE,0,0);
return 0;
}
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
Sleep(100);
}while(bExitThread==false);
return 0;
}
PROCESS_INFORMATION pi; //进程信息
杀死进程:
void CMainFrame::ExitMyProcess()
{
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pi.dwProcessId);
if(hProcess==NULL)
{
return;
}
//结束进程
if (TerminateProcess(hProcess,0))
{
return;
}
else
{
WriteLog("程序终止失败!");
return;
}
}