Dos窗口出现然后立即消失

Posted

技术标签:

【中文标题】Dos窗口出现然后立即消失【英文标题】:Dos window show up then disappears immidiately 【发布时间】:2017-04-14 12:29:21 【问题描述】:

当我运行下面的代码时,dos 窗口立即出现然后消失。 我想要的是窗口将保留并等待用户的下一个命令输入。 如果我想保持窗口显示并且我必须在我的项目中使用 createProcess 而不是 winexec 等,我应该如何处理 startupInfo.hStdInput。

int WINAPI WinMain(
                   HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpComLine,
                   int nCmdShow)

    SECURITY_ATTRIBUTES secAttr; 
    HANDLE hRead,hWrite;

secAttr.nLength = sizeof(SECURITY_ATTRIBUTES); 
secAttr.lpSecurityDescriptor = NULL; 
secAttr.bInheritHandle = TRUE; 
if (!CreatePipe(&hRead,&hWrite,&secAttr,0)) 
 
    return FALSE; 
 

char command[1024];
strcpy(command,"ping 192.168.0.1");

STARTUPINFO startupInfo;
PROCESS_INFORMATION processInfo; 
startupInfo.cb = sizeof(STARTUPINFO); 
GetStartupInfo(&startupInfo); 
startupInfo.hStdError = hWrite;     
startupInfo.hStdOutput = hWrite;
startupInfo.hStdInput = hRead;          
startupInfo.lpTitle = "CMD";

if (!CreateProcess(NULL, command,NULL,NULL,TRUE,NULL,NULL,NULL,&startupInfo,&processInfo)) 
 
        MessageBox(NULL, "Failed", NULL, MB_OK);
        CloseHandle(hWrite); 
        CloseHandle(hRead); 
        return FALSE; 
 

CloseHandle(hWrite); 
CloseHandle(hRead);

return 0;

【问题讨论】:

你为什么要像这样手动运行ping,而不是使用IcmpSendEcho() 我正在编写一个项目,我想通过我的 win32 应用程序使用控制台连续输入/输出,所以我希望 dos 窗口在代码 CreateProcess(NULL, command,NULL,NULL,TRUE,NULL ,NULL,NULL,&startupInfo,&processInfo) 正在执行并等待下一个用户的命令 当指定的command 完成运行时,DOS 窗口关闭。由于您的command 本身只是ping,所以当ping 退出时DOS 窗口将关闭。如果要在ping 退出后保持 DOS 窗口打开,则需要运行 cmd.exe 而不是指定/K 命令行开关,并将ping 作为cmd.exe 执行的初始命令,例如:cmd.exe /K ping 192.168.0.1。使用%COMSPEC% 环境变量获取cmd.exe 的完整路径。 你好,先生!但是如何将我的通用行输入到 cmd.exe?在这种情况下,'code WriteFile(hRead, buffer, 1024, &bytesRead, NULL)' 没有做任何事情 我告诉过你怎么做。将您的 command 字符串设置为 "cmd /K ping 192.168.0.1" 并将整个字符串传递给 CreateProcess() 【参考方案1】:

如果问题是进程窗口立即关闭,您可能应该添加pause ... 才能看到ping 命令的结果..

现在,我绝不是c++ 专家……但我建议,尝试以下代码行……

CreateProcess(  
                      "c:\\windows\\system32\\cmd.exe",  
                      "/k ping 192.168.0.1 && pause && exit",  
                      NULL,  
                      NULL,  
                      FALSE,  
                      0,  
                      NULL,  
                      NULL,  
                      &startupInfo,&processInfo);  

【讨论】:

为什么要使用&& pause && exit/k 开关? OP 说“等待用户的下一个命令输入”,但是这个组合不允许输入更多的用户命令。单独使用/k 会。如果你只是要退出,你也可以放弃&& exit并使用/c而不是/k @RemyLebeau 你可能是对的......我有点错过了“下一个命令”部分......

以上是关于Dos窗口出现然后立即消失的主要内容,如果未能解决你的问题,请参考以下文章

Phonegap 应用程序文本出现,然后立即消失。我该如何调试?

如何确保菜单关闭时立即消失,而不是部分消失?

Qt qwidget 瞬间出现和消失

StreamBuilder 的 Firebase 查询出现并立即消失

带有集合的自定义控件:集合编辑器出现但立即再次消失

QT Gui 窗口在 Maya 中出现然后消失