定时关机的小软件

来源:互联网 发布:linux命令 cp r 编辑:程序博客网 时间:2024/04/30 21:36

最近舍友突然说到shutdown -s -t 7200 这个自动关机的命令,突然想到把它写成一个小程序,就不用麻烦的去算秒了,下面是一段的代码。主要是创建了一个管道(参考网上代码的)将命令写入cmd,同时将cmd上的回复读出。这个是用MFC写的,下面是主要的代码。有点简陋,勿怪。


void CShutDownCmdDlg::CString2string(CString cstr, std::string& str)
{
DWORD dwNum=::WideCharToMultiByte(CP_ACP,NULL,cstr,-1,NULL,0,NULL,FALSE);
char* temp = new char[dwNum];
::WideCharToMultiByte(CP_ACP,NULL,cstr,-1,temp,dwNum,NULL,FALSE);
str = std::string(temp);
}
bool CShutDownCmdDlg::SisDigit(std::string & str)
{
for(int i = 0; i < str.length();i++)
{
if(!isdigit(str.at(i)))
{
return false;
}
}
return true;
}


int CShutDownCmdDlg::GetDigit(std::string & str)
{
int num = 0;
for(int i = 0; i < str.length();i++)
{
num *=10;
num += (str.at(i) - '0');
}
return num;
}
void CShutDownCmdDlg::OnClickedButtonok()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData();
CString h,m;
EHour.GetWindowTextW(h);
EMin.GetWindowTextW(m);
CString2string(h,hour);
CString2string(m,min);
if(!SisDigit(hour)||!SisDigit(min))
{
updateEditSta(_T("请保证输入的数据是数字!"));
return;
}

int num = 0;
num = GetDigit(hour)*3600;
num += GetDigit(min)*60;
CString snum;
snum.Format(_T("%d"),num);
updateEditSta(_T("将于")+snum+_T("s后关机。"));
CString cs = _T("c:\\windows\\system32\\cmd.exe /c ");
CString mcmd = _T("shutdown -s -t ");
mcmd += snum;

cs += mcmd;
LPTSTR lpsz = (LPTSTR)(LPCTSTR)cs;

UpdateData(FALSE);



SECURITY_ATTRIBUTES sa;
HANDLE hRead,hWrite;


sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if (!CreatePipe(&hRead,&hWrite,&sa,0))
{
updateEditSta(_T("Error on CreatePipe()!"));
return;
}

STARTUPINFO si;
PROCESS_INFORMATION pi;
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite;
si.hStdOutput = hWrite;
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
if (!CreateProcess(NULL,lpsz,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
{
updateEditSta(_T("Error on CreateProcess()!"));
return;
}
CloseHandle(hWrite);


// system("ping google.com");


char buffer[4096];
memset(buffer,0,4096);
DWORD byteRead;
while(true)
{
if (ReadFile(hRead,buffer,4095,&byteRead,NULL) == NULL)
{
break;
}
CString m_editoutput;
m_editoutput += buffer;
updateEditSta(m_editoutput);
UpdateData(FALSE);
Sleep(200);
}


}


void CShutDownCmdDlg::updateEditSta(CString strToAppend)
{
m_EditSta.Append(L">> ");
m_EditSta.Append(strToAppend);
m_EditSta.Append(L"\r\n");
UpdateData(FALSE);
Ehint.LineScroll(Ehint.GetLineCount());
}

0 1
原创粉丝点击