禁止系统()输出

首先,我主要是C#,.Net开发,所以如果这是一个愚蠢的问题,就轻松点我。

我正在实施一个Ericcson开源项目来将图像转换为另一种格式。 问题是,在转换输出到控制台发生如下…

1 file(s) copied. 

我需要禁止这个popup的对话框。 我只想执行没有输出的系统命令。 我想我已经隔离了导致这个代码的区域。

 void writeOutputFile(char *dstfile, uint8* img, uint8* alphaimg, int width, int height) { char str[300]; if(format!=ETC2PACKAGE_R_NO_MIPMAPS&&format!=ETC2PACKAGE_RG_NO_MIPMAPS) { fWritePPM("tmp.ppm",width,height,img,8,false); //PRINTF("Saved file tmp.ppm \n\n"); } else if(format==ETC2PACKAGE_RG_NO_MIPMAPS) { fWritePPM("tmp.ppm",width,height,img,16,false); } if(format==ETC2PACKAGE_RGBA_NO_MIPMAPS||format==ETC2PACKAGE_RGBA1_NO_MIPMAPS||format==ETC2PACKAGE_sRGBA_NO_MIPMAPS||format==ETC2PACKAGE_sRGBA1_NO_MIPMAPS) fWritePGM("alphaout.pgm",width,height,alphaimg,false,8); if(format==ETC2PACKAGE_R_NO_MIPMAPS) fWritePGM("alphaout.pgm",width,height,alphaimg,false,16); // Delete destination file if it exists if(fileExist(dstfile)) { sprintf(str, "del %s\n",dstfile); system(str); } int q = find_pos_of_extension(dstfile); if(!strcmp(&dstfile[q],".ppm")&&format!=ETC2PACKAGE_R_NO_MIPMAPS) { // Already a .ppm file. Just rename. sprintf(str,"move tmp.ppm %s\n",dstfile); //PRINTF("Renaming destination file to %s\n",dstfile); } else { // Converting from .ppm to other file format // // Use your favorite command line image converter program, // for instance Image Magick. Just make sure the syntax can // be written as below: // // C:\imconv source.ppm dest.jpg // if(format==ETC2PACKAGE_RGBA_NO_MIPMAPS||format==ETC2PACKAGE_RGBA1_NO_MIPMAPS||format==ETC2PACKAGE_sRGBA_NO_MIPMAPS||format==ETC2PACKAGE_sRGBA1_NO_MIPMAPS) { // Somewhere after version 6.7.1-2 of ImageMagick the following command gives the wrong result due to a bug. // sprintf(str,"composite -compose CopyOpacity alphaout.pgm tmp.ppm %s\n",dstfile); // Instead we read the file and write a tga. //PRINTF("Converting destination file from .ppm/.pgm to %s with alpha\n",dstfile); int rw, rh; unsigned char *pixelsRGB; unsigned char *pixelsA; fReadPPM("tmp.ppm", rw, rh, pixelsRGB, 8); fReadPGM("alphaout.pgm", rw, rh, pixelsA, 8); fWriteTGAfromRGBandA(dstfile, rw, rh, pixelsRGB, pixelsA, true); free(pixelsRGB); free(pixelsA); sprintf(str,""); // Nothing to execute. } else if(format==ETC2PACKAGE_R_NO_MIPMAPS) { sprintf(str,"imconv alphaout.pgm %s\n",dstfile); //PRINTF("Converting destination file from .pgm to %s\n",dstfile); } else { sprintf(str,"imconv tmp.ppm %s\n",dstfile); //PRINTF("Converting destination file from .ppm to %s\n",dstfile); } } // Execute system call system(str); free(img); if(alphaimg!=NULL) free(alphaimg); 

}

关于如何抑制popup的控制台,我迷失了方向。 当我们通过对dll的引用遍历图像时,许多控制台窗口在屏幕上闪烁。 需要阻止这种情况的发生。

非常感谢帮助。

尝试做:

 strcat( str, " > nul" ) // for Windows or //strcat( str, " > /dev/null" ) // for Unix system( str ) 

如果没有帮助,这可能会有所帮助:

 #include <string> #include <ShellAPI.h> int system_no_output( std::string command ) { command.insert( 0, "/C " ); SHELLEXECUTEINFOA ShExecInfo = {0}; ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; ShExecInfo.hwnd = NULL; ShExecInfo.lpVerb = NULL; ShExecInfo.lpFile = "cmd.exe"; ShExecInfo.lpParameters = command.c_str(); ShExecInfo.lpDirectory = NULL; ShExecInfo.nShow = SW_HIDE; ShExecInfo.hInstApp = NULL; if( ShellExecuteExA( &ShExecInfo ) == FALSE ) return -1; WaitForSingleObject( ShExecInfo.hProcess, INFINITE ); DWORD rv; GetExitCodeProcess( ShExecInfo.hProcess, &rv ); CloseHandle( ShExecInfo.hProcess ); return rv; } 

并将所有system()调用替换为system_no_output()

如果您使用的是C#,请点击此处 。 C#中使用的类是ProcessStartInfo 。 在链接示例中,查看将最小化控制台的OpenWithStartInfo成员函数。

至于在C ++中这样做,看看这里的函数spawn家庭。