隐藏system窗口你也行(就是那个cmd窗口,好多方法)
新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窗口,好多方法)的更多相关文章
- bat批处理文件运行时隐藏cmd窗口
想让bat运行时隐藏cmd窗口,最好的方法是使用vbs文件实现, 1.新建一个文本文档,改名为123.vbs,编辑内容: set ws=WScript.CreateObject("WScri ...
- java在CMD窗口执行程序的时候输入密码(隐藏一些敏感信息)
有时候我们需要从CMD窗口执行一些命令,有时候会输入一些敏感的信息,比如密码之类的东西,所以我们可以从控制台读取但是不希望别人看见我们的密码: import java.io.Console; /** ...
- 运行bat时隐藏cmd窗口
运行bat时隐藏cmd窗口 新建一个shrjj.vbs文件,文件内容为: Set ws = CreateObject("Wscript.Shell") ws.run "c ...
- system调用命令行命令而不显示命令行窗口
system调用命令行命令而不显示命令行窗口 通常用system调用命令行命令时都会弹出黑底白字的命令行窗口,下面的代码可以不显示弹出的命令行窗口. 代码如下 #pragma comment( lin ...
- C# Selenium操作指南,关闭黑色CMD窗口/禁用图片/隐藏浏览器等
引用部分:1. 2. 配置部分: ChromeDriverService driverService = ChromeDriverService.CreateDefaultService(); dri ...
- python 使用多进程打开多个cmd窗口,并在子进程结束之后关闭cmd窗口
额,我想表达的是使用os.system()打开另一个可执行文件,然后等待其结束,关闭cmd窗口 主要是我突发奇想想装逼; 如果只是用multiprocessing库的多进程,然后输出信息的话,根本没法 ...
- CMD窗口如何调整大小 / 颜色
Windows默认的命令行工具CMD暴丑无比..很多人都会因为这个原因去寻找漂亮的命令行工具.. 但是很多所谓的命令行工具并不能完美的支持到CMD.. 譬如 PowerCMD 或 Cmder 之流.. ...
- VC++6.0一些常见问题解决方法(打开多个窗口、行号、添加文件无响应、更改.exe图标及名称等等)
背景: 最近使用VC++6.0做一个界面,供测试CAN通信使用.由于客户希望我们提供简单方便的函数接口让其最快速使用CAN,DLL(动态链接库)是不二之选.做DLL需要两个VC窗口进行测试才方便.可是 ...
- 在CMD窗口中使用javac和java命令进行编译和执行带有包名的具有继承关系的类
一.背景 最近在使用记事本编写带有包名并且有继承关系的java代码并运行时发现出现了很多错误,经过努力一一被解决,今天我们来看一下会遇见哪些问题,并给出解决办法. 二.测试过程 1.父类代码 pack ...
随机推荐
- 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(5)有趣的指针
一.指针是C语言的灵魂 # include <stdio.h> int main(){ int *p; //p是变量名,int *表示p变量存放的是int类型变量的地址,p是一个指针变量 ...
- [Node.js] Identify memory leaks with nodejs-dashboard
In this lesson, I introduce a memory leak into our node.js application and show you how to identify ...
- 【hdu 3032】Nim or not Nim?
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...
- Oracle 自己主动内存參数依赖性
图例:在该图中使用了下面參数名称缩写: MT = MEMORY_TARGET MMT = MEMORY_MAX_TARGET ST = SGA_TARGET PAT = PGA_AGGREGATE_T ...
- list数组归并去重
C#两路list数组归并去重 个相同类型已排序数据进行合并,虽然list数组中有AddRange方法,但它只是把第二个数组从第一个数组末尾插入,假如两个数组有重复数据,保存进去.还有Union方法合并 ...
- 一起学Python:字符串介绍
字符串介绍 <1>python中字符串的格式 如下定义的变量a,存储的是数字类型的值 a = 100 如下定义的变量b,存储的是字符串类型的值 b = "hello itcast ...
- 利用WPF建立自己的3d gis软件(非axhost方式)(八)拖动一个UI到地球上
原文:利用WPF建立自己的3d gis软件(非axhost方式)(八)拖动一个UI到地球上 先下载SDK:https://pan.baidu.com/s/1M9kBS6ouUwLfrt0zV0bPew ...
- WPF 获得触摸精度和触摸点
原文:WPF 获得触摸精度和触摸点 本文主要告诉大家如何获得所有的触摸设备的触摸精度和触摸点数. 需要通过反射的方法才可以拿到触摸的精度. 使用 Tablet.TabletDevices 可以获得所有 ...
- iOS项目double、float精度丢失解决办法
描述 在iOS项目中老是遇到double.float精度丢失的问题 PS: NSString * jsonStr = @"{\"9.70\":9.70,\"67 ...
- Sublime Text3中JSX支持Emmet快捷键
在复习React的过程中,发现Sublime有些快捷键不能用了,如Emmet的Tab快速生成HTML代码只能用Ctrl+E快捷键,而不能用Tab键了,在网上找了很多文章,发现都有问题,最终自己通过下面 ...