通过粘贴板获取DOS窗口内容及发送终止消息

获取DOS窗口内容方法

1. 将输出转存到文件

  • 先将结果保存到文件dir c:\>d:\out.txt
  • 然后程序读取指定文件内容

2. 通用句柄重定向

  • 通过句柄重定向稍复杂一些,需要创建进程前先准备好输入、输出句柄

  • 创建进程执行DOS程序

  • 周期读取输入句柄的数量
    示例代码:

    CString ExecuteExternalFile(CString csExeName, CString csArguments)
    {
    CString csExecute;
    csExecute=csExeName + " " + csArguments;
    
    SECURITY_ATTRIBUTES secattr; 
    ZeroMemory(&secattr,sizeof(secattr));
    secattr.nLength = sizeof(secattr);
    secattr.bInheritHandle = TRUE;
    
    HANDLE rPipe, wPipe;
    
    //Create pipes to write and read data
    CreatePipe(&rPipe,&wPipe,&secattr,0);
    //
    STARTUPINFO sInfo; 
    ZeroMemory(&sInfo,sizeof(sInfo));
    PROCESS_INFORMATION pInfo; 
    ZeroMemory(&pInfo,sizeof(pInfo));
    sInfo.cb=sizeof(sInfo);
    sInfo.dwFlags=STARTF_USESTDHANDLES;
    sInfo.hStdInput=NULL; 
    sInfo.hStdOutput=wPipe; 
    sInfo.hStdError=wPipe;
    char command[1024]; strcpy(command,  
            csExecute.GetBuffer(csExecute.GetLength()));
    
    //Create the process here.
    CreateProcess(0 command,0,0,TRUE,
            NORMAL_PRIORITY_CLASS|CREATE_NO_WINDOW,0,0,&sInfo,&pInfo);
    CloseHandle(wPipe);
    
    //now read the output pipe here.
    char buf[100];
    DWORD reDword; 
    CString m_csOutput,csTemp;
    BOOL res;
    do
    {
                    res=::ReadFile(rPipe,buf,100,&reDword,0);
                    csTemp=buf;
                    m_csOutput+=csTemp.Left(reDword);
    }while(res);
    return m_csOutput;
    }

    参考网页:

    Execute a Console Application From VC++

    An MFC Process Class

3. 通过粘贴板

  • 创建DOS进程获取进程ID
  • 通过EnumWindows函数获取进程ID对应的HWND
  • 通过系统菜单发送Ctrl+ACtrl+C拷贝数据到粘贴板

示例代码:


HWND    g_hWnd = NULL;

BOOL CALLBACK _EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
    DWORD dwProcessId(0);
    GetWindowThreadProcessId(hwnd, &dwProcessId);

    if ((DWORD)lParam == dwProcessId)
    {
        g_hWnd = hwnd;
        return FALSE;
    }

    return TRUE;
}

CString GetConsoleText(HWND hWndConsole)
{
    if (!IsWindow(hWndConsole))
    {
        return _T("");
    }

    CString strRet;
    HMENU   hSysMenu = GetSystemMenu(hWndConsole, FALSE);
    if (NULL != hSysMenu)
    {
        TCHAR   szMenuText[128];
        int     nItemCnt = GetMenuItemCount(hSysMenu);

        for (int i = 0; i < nItemCnt; ++i)
        {
            if (GetMenuString(hSysMenu, i, szMenuText, _countof(szMenuText), MF_BYPOSITION))
            {
                if (_tcsstr(szMenuText, _T("编辑")) != NULL)
                {
                    HMENU hEditMenu = GetSubMenu(hSysMenu, i);

                    //全选
                    ::SendMessage(hWndConsole, WM_COMMAND, GetMenuItemID(hEditMenu, 3), 0);
                    //复制
                    ::SendMessage(hWndConsole, WM_COMMAND, GetMenuItemID(hEditMenu, 1), 0);

                    if (!OpenClipboard(hWndConsole))
                    {
                        break;
                    }

                    HANDLE hClipboardData = GetClipboardData(CF_UNICODETEXT);
                    if (hClipboardData)
                    {
                        wchar_t *pchData = (wchar_t*)GlobalLock(hClipboardData);
                        if (pchData)
                        {
                            strRet = pchData;
                            GlobalUnlock(hClipboardData);
                        }
                    }

                    CloseClipboard();
                    break;
                }
            }
        }
    }

    return strRet;
}

void CDlgTestDlg::OnBnClickedBtnExec()
{
    //启动示例程序作为子进程
    STARTUPINFO si = {sizeof si};
    si.cb = sizeof(STARTUPINFO);

    si.wShowWindow = SW_SHOW;  
    si.dwFlags     = STARTF_USESHOWWINDOW;  
    PROCESS_INFORMATION pi; 
    CreateProcess(NULL, "cmd /k @echo off>nul & ftp -i -d -s:c:\\cmd.txt", NULL, NULL, TRUE,  CREATE_NEW_PROCESS_GROUP , NULL, NULL, &si, &pi);

    Sleep(5*1000);

    EnumWindows(_EnumWindowsProc, (LPARAM)pi.dwProcessId);    

    //发送Ctrl_BREAK消息
    if (AttachConsole(pi.dwProcessId))
    {
        GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, pi.dwProcessId);
        FreeConsole();
    }

    Sleep(500);//等等FTP终止输出完毕
    SetDlgItemText(IDC_EDIT, GetConsoleText(g_hWnd));

    TerminateProcess(pi.hProcess, 0);
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);    
}

c:\cmd.txt文件内容

open 127.0.0.1
download
download
get V8Test.zip
bye

参考网址:
Get Text from a CMD window

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sdhongjun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值