新建项目,设置Ping窗口,目的使用ping命令ping地址,并且显示ping命令的输出

由于获取系统命令输出的过程是在一个while(true)中阻塞进行的,无法进行界面的实时显示,因此使用DoEvent函数进行刷新界面。实现
bool DoEvents()
{
MSG msg;
while (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
{
return false;
}
if (!AfxGetApp()->PreTranslateMessage(&msg))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}
return true;
}
Ping按钮代码
void CTestCDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
//清空文本框
((CEdit*)GetDlgItem(IDC_EDIT1))->SetWindowText(L"");
SECURITY_ATTRIBUTES sa;
HANDLE hRead,hWrite;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if (!CreatePipe(&hRead,&hWrite,&sa,0))
{
return ;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si,sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite;
si.hStdOutput = hWrite;
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
//获取ip控件ip地址
BYTE nf1,nf2,nf3,nf4;
((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(nf1,nf2,nf3,nf4);
CString strCmd;
strCmd.Format(L"ping %d.%d.%d.%d",nf1,nf2,nf3,nf4);
if (!CreateProcess(NULL,strCmd.GetBuffer(),NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
{
return ;
}
::CloseHandle(pi.hProcess);
::CloseHandle(hWrite);
DWORD butesRead;
CString tempStr;
char buffer[2048] = {0};
//获取输出内容
while(true){
memset(buffer,0,sizeof(buffer));
if (NULL == ReadFile(hRead,buffer,sizeof(buffer),&butesRead,NULL))
{
break;
}
tempStr = buffer;
//追加内容到文本框
((CEdit*)GetDlgItem(IDC_EDIT1))->SetSel(-1);
((CEdit*)GetDlgItem(IDC_EDIT1))->ReplaceSel(tempStr);
//刷新界面显示
DoEvents();
}
CloseHandle(hRead);
}
测试

MFC程序
