【问题标题】:Output string to cmd displayed right but not recognised as command输出字符串到 cmd 显示正确但不被识别为命令
【发布时间】:2014-01-28 16:29:44
【问题描述】:

我正在使用 WriteConsoleOutputCharacter 在控制台上写入一个字符串。我的目标是,如果该字符串是一个命令,那么我可以正常执行它(按回车键)。但是结果是,虽然我有命令显示好吧,它不能被执行。当我点击输入时,cmd只是忽略它并显示一个新行,就好像前一个是空的一样。有没有办法强制 cmd 将其视为命令? 这是我所做的:

HANDLE hStdout;
CONSOLE_SCREEN_BUFFER_INFO csbi; 

void dir( HANDLE hConsole )
{
    DWORD cCharsWritten;
    COORD  crCurr;
    GetConsoleScreenBufferInfo(hStdout, &csbi);
    crCurr = csbi.dwCursorPosition;

    std::wstring ss;
    ss=std::wstring(L"dir ");

    SetConsoleCursorPosition( hConsole, crCurr );

    if( !WriteConsoleOutputCharacter( hConsole,         
                                ss.c_str(),     
                                (DWORD)ss.length(),       
                                crCurr,     
                                &cCharsWritten ))
    {
      return;
    }

}

int main( void )
{
    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
    GetConsoleScreenBufferInfo(hStdout, &csbi);
    dir(hStdout);
    return 0;
}

我得到的结果是

C:\Users\..\Desktop>prog.exe
dir

这不好,因为我缺少提示输入新命令的“C:\Users..\Desktop>”部分。 所以我想我会使用 start /B 方法执行我的程序来获取提示。现在的输出确实是

C:\Users\..\Desktop>start /B prog.exe
C:\Users\..\Desktop>dir

但是当我按回车时没有执行dir命令,我只是换了一个新行。

C:\Users\..\Desktop>start /B prog.exe
C:\Users\..\Desktop>dir
C:\Users\..\Desktop>

【问题讨论】:

    标签: c++ cmd


    【解决方案1】:

    WriteConsoleOutputCharacter 是一个写入控制台的函数。它不会将其输入控制台应用程序本身的输入缓冲区。为此,您需要将其输入 cmd.exe 上的 stdin,而不是在控制台的输出中绘制它。这样做的方法是使用例如_popen(或一些较低级别的CreateProcess,然后将I/O 重定向到管道)打开控制台。然后将要执行的命令输入管道。 cmd.exe 然后会认为它已被输入,并执行命令。

    【讨论】:

      猜你喜欢
      • 2012-06-19
      • 2018-12-29
      • 1970-01-01
      • 2021-11-22
      • 2022-01-06
      • 2020-10-14
      • 2019-02-23
      • 2011-10-26
      • 2014-04-20
      相关资源
      最近更新 更多