调用system函数时,如何隐藏其dos窗口

现在要运行一个基于命令行的程序,使用system函数,启动后出现一个dos窗口,由于时间比较长,不美观,想要隐藏这个窗口,不知道有什么办法。

用其他的函数(如shellexec)不知道是否可行。
---------------------------------------------------------------

system函数好象没有提供这样的功能
你可以使用CreateProcess来启动一个进程
BOOL CreateProcess(
LPCTSTR lpApplicationName, // name of executable module
LPTSTR lpCommandLine, // command line string
LPSECURITY_ATTRIBUTES lpProcessAttributes, // SD
LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
BOOL bInheritHandles, // handle inheritance option
DWORD dwCreationFlags, // creation flags
LPVOID lpEnvironment, // new environment block
LPCTSTR lpCurrentDirectory, // current directory name
LPSTARTUPINFO lpStartupInfo, // startup information
LPPROCESS_INFORMATION lpProcessInformation // process information
);
把dwCreationFlags这个参数设置为CREATE_NO_WINDOW
这个对console程序有效,对纯DOS下的程序无效

希望对你有所帮助!
---------------------------------------------------------------

使用WinExec可以的,不过你得知道使用的应用程序的名称
---------------------------------------------------------------

ShellExecute(..................., SW_HIDE)
---------------------------------------------------------------

用这个 WinExec("xxx.exe", 0); 我用过不会显示 Dos 程序的窗体。
---------------------------------------------------------------

也可以使用ShellExecute();

ShellExecute(NULL, NULL,"xxx.exe", NULL, NULL, SW_SHOWNORMAL);
---------------------------------------------------------------

ShellExecute,WinExce都可以达到这个要求
---------------------------------------------------------------

ShellExecute(NULL, NULL,"xxx.exe", NULL, NULL, SW_HIDE);
WinExec("xxx.exe", SW_HIDE);
---------------------------------------------------------------

要是我就使用CreateProcess函数,不但可以达到你的功能,还能重新定向标准的输入输出等等,因为有时候你不但要执行他,还要获取他执行的结果啊
BOOL CreateProcess(
LPCTSTR lpApplicationName, // name of executable module
LPTSTR lpCommandLine, // command line string
LPSECURITY_ATTRIBUTES lpProcessAttributes, // SD
LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
BOOL bInheritHandles, // handle inheritance option
DWORD dwCreationFlags, // creation flags
LPVOID lpEnvironment, // new environment block
LPCTSTR lpCurrentDirectory, // current directory name
LPSTARTUPINFO lpStartupInfo, // startup information
LPPROCESS_INFORMATION lpProcessInformation // process information
);
通过后两个参数你可以做很多有意义的事
---------------------------------------------------------------

用CreateProcess,最后一个参数有进程句柄。调用WaitForSingleObject即可,如:
PROCESS_INFORMATION pi={0};
if(CreateProcess(NULL,cmdLine,NULL,NULL,TRUE,NULL,NULL,NULL,&s,&pi))
{
WaitForSingleObject(pi.hProcess ,INFINITE);
//等待进程执行完毕
CloseHandle(pi.hProcess );
CloseHandle(pi.hThread );
}
---------------------------------------------------------------

是的,和上面几位一样,此时我推荐使用 CreateProcess 来代替 system 设置创建时的参数为 CREATE_NO_WINDOW 来阻目 Dos 窗口的显示,如下所示 :

STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof STARTUPINFO;

PROCESS_INFORMATION pi;
BOOL res = CreateProcess(NULL,
"c://winnt//system32//cmd.exe", // 执行你的 dos 命令
NULL,
NULL,
NULL,
NORMAL_PRIORITY_CLASS ¦ CREATE_NO_WINDOW,
NULL,
NULL,
&si,
&pi);

if (TRUE == res)
{
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}


不要忘记了释放资源哦, good luck. ^_^
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值