MFC调用系统Ping命令,并且获取命令输出(隐藏控制台窗口)

⌚Time: 2022-12-25 23:00:00

👨‍💻Author: Jack Ge

新建项目,设置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程序