我正在使用WriteConsoleOutputCharacter在控制台上写一个字符串。我的目标是,如果该字符串是一个命令,那么我可以正常执行它(通过按Enter键)。但结果是,虽然我有命令显示好吧,它无法执行。当我点击进入时,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>
答案 0 :(得分:0)
WriteConsoleOutputCharacter
是一个写入控制台的函数。它不会将其提供给控制台应用程序本身的输入缓冲区。为此,您需要将其提供给cmd.exe上的stdin
,而不是在控制台的输出上绘制它。这样做的方法是打开控制台,例如_popen
(或某个较低级别CreateProcess
,然后将I / O重定向到管道)。然后,将要执行的命令提供给管道。然后cmd.exe会认为它已被输入,并执行命令。