定时关机的小软件
2015-11-30 23:27
661 查看
最近舍友突然说到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());
}
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());
}
相关文章推荐
- 飞信的CMD命令行接口批量发送信息
- 用vbs实现cmd功能的代码
- vbs实现的eMule电驴自动关机脚本代码
- CMD命令行高级教程精选合编合集
- cmd下PUSHD和POPD命令使用说明
- cmd del命令 文件删除
- cmd NTSD命令用法详解
- 执行批处理bat程序中的条件处理
- cmd Tasklist与Tskill管理Windows系统进程
- cmd下开启telnet的方法
- cmd fsutil 命令新建空文本文件
- CMD下一个命令遍历目录并删除相同文件的代码
- cmd rd命令 删除文件夹
- cmd if条件 条件判断
- 用vbs实现cmd多命令运行功能代码
- 运行cmd直接进入指定目录下的命令
- 秒用自动关机命令实现定时提醒你该睡觉了
- CMD命令行中以管理员权限启动应用程序实现方法
- bat定时自动关机,bat自动结束任务关闭程序,dos自动结束程序后关机
- cmd md命令 创建文件夹