新process的启动,可以通过system(const char*)函数启动另外一个程序,但是有一个小问题,就是每次执行system函数的时候,都会弹出dos窗口(命令行嘛~~~),有没有什么方法能够让我调用的程序在后台执行呢?

好像无法隐藏system函数的窗口,只能最小化等参数,不过有另外一种选择开启另外一个进程。

其方法主要有以下几种:

1. WinExec(LPCSTR, UInt)函数
        其第一个参数相当于system函数的参数,第二个参数可以设置窗口是否显示,SW_HIDE这个宏表示隐藏窗口,例如:
      WinExec(cmd.c_str(),SW_HIDE);//cmd(string类型)中为我们要调用的程序名及其参数, 如 “dir *.exe ”
    但是这个有一个问题,这个函数创建完这个进程后就返回了,也就是说它返回后,该进程不一定已经结束,这个就有点和system不一样了,在这里我无法使用这个函数了~~~

2.ShellExecuteEx(SHELLEXECUTEINFO*)函数
       其参数是一个结构体,具体作用还是类似于system的参数,使用例子:
    SHELLEXECUTEINFO ShExecInfo = {0};
    ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
    ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
    ShExecInfo.hwnd = NULL;
    ShExecInfo.lpVerb = NULL;
    ShExecInfo.lpFile = cmd.c_str();//调用的程序名
    ShExecInfo.lpParameters = par.c_str();//调用程序的命令行参数
    ShExecInfo.lpDirectory = NULL;
    ShExecInfo.nShow = SW_HIDE;//窗口状态为隐藏
    ShExecInfo.hInstApp = NULL;
    ShellExecuteEx(&ShExecInfo);
    但是这个还是有问题,同1中一样,无法确定该进程是否结束~~~

3.CreateProcess函数,这个的用法可以去百度一下~~~

然后,有没有办法使得主程序在其启动的子程序结束之前一直保持暂停状态,可以使用
    WaitForSingleObject(HANDLE,DWORD)函数
    例子:
    在2的代码下加一行:WaitForSingleObject(ShExecInfo.hProcess,INFINITE);////等到该进程结束

完全可以把上述代码片段封装成一个小的函数,来代替system函数
    void mySystem(const string& cmd, const string& par, int nShow)
    {
       SHELLEXECUTEINFO ShExecInfo = {0};
        ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
        ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
        ShExecInfo.hwnd = NULL;
        ShExecInfo.lpVerb = NULL;
        ShExecInfo.lpFile = cmd.c_str();//调用的程序名
        ShExecInfo.lpParameters = par.c_str();//调用程序的命令行参数
        ShExecInfo.lpDirectory = NULL;
        ShExecInfo.nShow = SW_HIDE;//窗口状态为隐藏
        ShExecInfo.hInstApp = NULL;
        ShellExecuteEx(&ShExecInfo); //启动新的程序
        WaitForSingleObject(ShExecInfo.hProcess,INFINITE);////等到该进程结束

}

那么bat脚本怎么办呢?? 以下是百度的方法,可以参考。

 bat文件运行时会有一个黑黑的cmd.exe窗口,很吓人,就算用start/min命令去运行bat文件,电脑的任务栏下仍然会有相关的图标,怎么让bat文件在后台无声无息无影无形地运行呢?以下的办法可以达到你的目的。

方法一
  bat里有隐藏窗口的命令,很简单,只需要在代码头部加一段代码就可以了。
  @echo off
  if "%1" == "h" goto begin
  mshta vbscript:createobject("wscript.shell").run("%~nx0 h",0)(window.close)&&exit
  :begin
  ::下面是你自己的代码。 方法二
  在你批处理的相同目录下新建一个记事本,里面输入:
  DIM objShell set objShell=wscript.createObject("wscript.shell")
  iReturn=objShell.Run("cmd.exe /C c:\1.bat", 0, TRUE)   
  (其中win.bat为你自己的批处理名字,自己改)
  然后把这个记事本保存为后缀名为.vbe的文件,到时候你只要运行这个vbe文件就达到目的了!
  可以写的简单点:
  Set ws = CreateObject("Wscript.Shell")
  ws.run "cmd /c c:\1.bat",0
  或者
  CreateObject("WScript.Shell").Run "cmd /c c:\1.bat",0
  (这种写法很多杀软报毒, 需要替换参数0)
  最后那个0是指窗口参数,用法为:
  0 隐藏窗口并激活另一窗口。
  1 激活并显示一个窗口。若窗口是最小化或最大化,则恢复到其原来的大小和位置。
  2 激活窗口并以最小化显示该窗口。
  3 激活窗口并以最大化显示该窗口。
  4 按窗口最近的大小和位置显示。活动窗口保持活动。
  5 以当前大小和位置激活并显示窗口。
  6 最小化指定窗口并激活按 Z 序排序的下一个顶层窗口。
  7 最小化显示窗口。活动窗口保持活动。
  8 以当前状态显示窗口。活动窗口保持活动。
  9 激活并显示窗口。若窗口是最小化或最大化,则恢复到原来的大小和位置。在还原应用程序的最小化窗口时,应指定该标志。 http://blog.csdn.net/flyingleo1981/article/details/72621168

隐藏system窗口你也行(就是那个cmd窗口,好多方法)的更多相关文章

  1. bat批处理文件运行时隐藏cmd窗口

    想让bat运行时隐藏cmd窗口,最好的方法是使用vbs文件实现, 1.新建一个文本文档,改名为123.vbs,编辑内容: set ws=WScript.CreateObject("WScri ...

  2. java在CMD窗口执行程序的时候输入密码(隐藏一些敏感信息)

    有时候我们需要从CMD窗口执行一些命令,有时候会输入一些敏感的信息,比如密码之类的东西,所以我们可以从控制台读取但是不希望别人看见我们的密码: import java.io.Console; /** ...

  3. 运行bat时隐藏cmd窗口

    运行bat时隐藏cmd窗口 新建一个shrjj.vbs文件,文件内容为: Set ws = CreateObject("Wscript.Shell") ws.run "c ...

  4. system调用命令行命令而不显示命令行窗口

    system调用命令行命令而不显示命令行窗口 通常用system调用命令行命令时都会弹出黑底白字的命令行窗口,下面的代码可以不显示弹出的命令行窗口. 代码如下 #pragma comment( lin ...

  5. C# Selenium操作指南,关闭黑色CMD窗口/禁用图片/隐藏浏览器等

    引用部分:1. 2. 配置部分: ChromeDriverService driverService = ChromeDriverService.CreateDefaultService(); dri ...

  6. python 使用多进程打开多个cmd窗口,并在子进程结束之后关闭cmd窗口

    额,我想表达的是使用os.system()打开另一个可执行文件,然后等待其结束,关闭cmd窗口 主要是我突发奇想想装逼; 如果只是用multiprocessing库的多进程,然后输出信息的话,根本没法 ...

  7. CMD窗口如何调整大小 / 颜色

    Windows默认的命令行工具CMD暴丑无比..很多人都会因为这个原因去寻找漂亮的命令行工具.. 但是很多所谓的命令行工具并不能完美的支持到CMD.. 譬如 PowerCMD 或 Cmder 之流.. ...

  8. VC++6.0一些常见问题解决方法(打开多个窗口、行号、添加文件无响应、更改.exe图标及名称等等)

    背景: 最近使用VC++6.0做一个界面,供测试CAN通信使用.由于客户希望我们提供简单方便的函数接口让其最快速使用CAN,DLL(动态链接库)是不二之选.做DLL需要两个VC窗口进行测试才方便.可是 ...

  9. 在CMD窗口中使用javac和java命令进行编译和执行带有包名的具有继承关系的类

    一.背景 最近在使用记事本编写带有包名并且有继承关系的java代码并运行时发现出现了很多错误,经过努力一一被解决,今天我们来看一下会遇见哪些问题,并给出解决办法. 二.测试过程 1.父类代码 pack ...

随机推荐

  1. SendMessageTimeout 的使用

    在WINDOW编程中,发送消息的常用API有SendMessage,PostMessage,PostThreadMessage. 一般每个线程有两个队列:一个用来接收通过Send函数的消息,另外一个队 ...

  2. Momentum(动量/冲量)的理解及应用

    1. 基本概念(Momentum vs SGD) Momentum 用于加速 SGD(随机梯度下降)在某一方向上的搜索以及抑制震荡的发生. GD(gradient descent) θt=θt−1−η ...

  3. TOP 10 ONLINE COMPILER

    Top 10 Online Compilers +1338 Tweet Share106 Share Pin 444 Shares Online compilers are one type of t ...

  4. [NativeScript] Style NativeScript views using the default core theme

    The default core theme comes preinstalled and ready to go with every new project. Learn how to use s ...

  5. 【u240】棋子放置

    Time Limit: 1 second Memory Limit: 128 MB 小虎刚刚上了幼儿园,老师让他做一个家庭作业:首先画3行格子,第一行有三个格子,第二行有2个格子,第三行有1个格子. ...

  6. 学习鸟哥的Linux私房菜笔记(15)——文件系统

    一.文件结构 为了能在设备上存储与读取文件,我们需要在分区上创立文件系统 文件系统记录目录与文件我们称之为文件结构 每一个文件系统在Linux里都被解释成由一个根目录为起点的目录结构 Linux将各个 ...

  7. 微信小程序实例:实现tabs选项卡效果

    最近微信应用号是炒的如火如荼,热门满满,但是也可以发现搜索关键词出来,各类网站出现的还都是微信的官方文档解释.正好赶上这个热潮,这几天先把小程序技术文档看了个遍,就直接着手写案例了.很多组件微信内部已 ...

  8. 【23.24%】【codeforces 629C】Famil Door and Brackets

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  9. No_Sql总结

    NoSQL简介 NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL",是对不同于传统的关系型数据库的数据库管理系统的统称.在现代的计算系统上每天网络上都 ...

  10. .NET 中使用 Mutex 进行跨越进程边界的同步 - walterlv

    原文:.NET 中使用 Mutex 进行跨越进程边界的同步 - walterlv .NET 中使用 Mutex 进行跨越进程边界的同步 2018-12-30 08:41 Mutex 是 Mutual ...