MFC调用CMD命令时,可不可以不弹出控制台黑框
MFC调用CMD命令时,能否不弹出控制台黑框?
程序中调用了形如 system("xcopy ....."); 这样的,而且是多处调用
所以存在的问题是,控制台黑框会不断的弹出来,而且每次弹出的窗口位置还不同,导致做其他工作的焦点会被它抢掉,比如正在VS编辑代码,黑框出来之后VS就失去焦点了,影响其他的工作。有时这个程序的运行时间好几个小时,做其他事情的效率就大大降低
问诸位大侠有没有办法让他不弹出,或者其他解决方法?前提是用system的代码部分不修改
------解决方案--------------------
参考这个
http://blog.csdn.net/wallaceli1981/article/details/6655287
------解决方案--------------------
应该是不行吧 cmd的那些命令不是通过启动参数可以执行的
------解决方案--------------------
可以,有方法能让那个黑窗口不闪的
------解决方案--------------------
如果你非要执行system命令 并且不想让cmd出窗口 估计得写个hook了 专门勾cmd的窗口创建 然后处理
------解决方案--------------------
第二个参数是LPTSTR,不是LPCTSTR
------解决方案--------------------
------解决方案--------------------
createprocess无非是通过启动参数来执行命令 你先确认 用“运行”能达到效果再说 如果那样都不行 createprocess都不行
------解决方案--------------------
你调起了别的程序,要想控制它,就得hook他,否则没招
------解决方案--------------------
用递归调用CopyFile和CreateDirectory可好?
------解决方案--------------------
用管道导向。
------解决方案--------------------
SHELLEXECUTEINFO shellExeInfo;
memset(&shellExeInfo, 0, sizeof(shellExeInfo));
shellExeInfo.cbSize = sizeof(SHELLEXECUTEINFO);
shellExeInfo.fMask = SEE_MASK_DOENVSUBST
------解决方案--------------------
SEE_MASK_FLAG_DDEWAIT
------解决方案--------------------
0x04000000
------解决方案--------------------
SEE_MASK_NOCLOSEPROCESS
------解决方案--------------------
SEE_MASK_NO_CONSOLE;
shellExeInfo.lpVerb = "open";
shellExeInfo.hwnd = NULL;
shellExeInfo.lpFile = "regsvr32.exe";//这个替换成你的复制命令
shellExeInfo.lpParameters = strVideoShortPath.c_str(); //这是你命令的参数
shellExeInfo.lpDirectory = NULL;
shellExeInfo.nShow = SW_HIDE;
shellExeInfo.hInstApp = NULL;
::ShellExecuteEx(&shellExeInfo);
if(shellExeInfo.hProcess)
{
::WaitForSingleObject(shellExeInfo.hProcess, INFINITE);
}
------解决方案--------------------
CreateProcess然后使用管道重定向。
------解决方案--------------------
WinExec 加上 sw_hide参数, 可以简单解决。
程序中调用了形如 system("xcopy ....."); 这样的,而且是多处调用
所以存在的问题是,控制台黑框会不断的弹出来,而且每次弹出的窗口位置还不同,导致做其他工作的焦点会被它抢掉,比如正在VS编辑代码,黑框出来之后VS就失去焦点了,影响其他的工作。有时这个程序的运行时间好几个小时,做其他事情的效率就大大降低
问诸位大侠有没有办法让他不弹出,或者其他解决方法?前提是用system的代码部分不修改
------解决方案--------------------
参考这个
http://blog.csdn.net/wallaceli1981/article/details/6655287
------解决方案--------------------
应该是不行吧 cmd的那些命令不是通过启动参数可以执行的
------解决方案--------------------
可以,有方法能让那个黑窗口不闪的
------解决方案--------------------
如果你非要执行system命令 并且不想让cmd出窗口 估计得写个hook了 专门勾cmd的窗口创建 然后处理
------解决方案--------------------
BOOL WINAPI CreateProcess(
__in_opt LPCTSTR lpApplicationName,
__inout_opt LPTSTR lpCommandLine,
__in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes,
__in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes,
__in BOOL bInheritHandles,
__in DWORD dwCreationFlags,
__in_opt LPVOID lpEnvironment,
__in_opt LPCTSTR lpCurrentDirectory,
__in LPSTARTUPINFO lpStartupInfo,
__out LPPROCESS_INFORMATION lpProcessInformation
);
第二个参数是LPTSTR,不是LPCTSTR
------解决方案--------------------
STARTUPINFO si = {0};
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
if (!CreateProcess(_T("C:\\WINDOWS\\system32\\cmd.exe"), CommandLine, NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
------解决方案--------------------
createprocess无非是通过启动参数来执行命令 你先确认 用“运行”能达到效果再说 如果那样都不行 createprocess都不行
------解决方案--------------------
你调起了别的程序,要想控制它,就得hook他,否则没招
------解决方案--------------------
用递归调用CopyFile和CreateDirectory可好?
------解决方案--------------------
用管道导向。
------解决方案--------------------
SHELLEXECUTEINFO shellExeInfo;
memset(&shellExeInfo, 0, sizeof(shellExeInfo));
shellExeInfo.cbSize = sizeof(SHELLEXECUTEINFO);
shellExeInfo.fMask = SEE_MASK_DOENVSUBST
------解决方案--------------------
SEE_MASK_FLAG_DDEWAIT
------解决方案--------------------
0x04000000
------解决方案--------------------
SEE_MASK_NOCLOSEPROCESS
------解决方案--------------------
SEE_MASK_NO_CONSOLE;
shellExeInfo.lpVerb = "open";
shellExeInfo.hwnd = NULL;
shellExeInfo.lpFile = "regsvr32.exe";//这个替换成你的复制命令
shellExeInfo.lpParameters = strVideoShortPath.c_str(); //这是你命令的参数
shellExeInfo.lpDirectory = NULL;
shellExeInfo.nShow = SW_HIDE;
shellExeInfo.hInstApp = NULL;
::ShellExecuteEx(&shellExeInfo);
if(shellExeInfo.hProcess)
{
::WaitForSingleObject(shellExeInfo.hProcess, INFINITE);
}
------解决方案--------------------
CreateProcess然后使用管道重定向。
------解决方案--------------------
WinExec 加上 sw_hide参数, 可以简单解决。