exe、msi、dos、bat等静默运⾏,后台运⾏,不弹窗的解决办法1、exe程序本⾝不想显⽰,waitforsingleobject函数
在源码开头中加⼊ #pragma comment( linker, "/subsystem:windows /entry:mainCRTStartup" )
2、打开其他的exe
2.1使⽤WinExec(LPCSTR, UInt)函数
其第⼀个参数相当于system函数的参数,第⼆个参数可以设置窗⼝是否显⽰,SW_HIDE这个宏表⽰隐藏窗⼝,例如:
WinExec(cmd.c_str(),SW_HIDE);//cmd(string类型)中为我们要调⽤的程序名及其参数,如 “dir *.exe ”
但是这个有⼀个问题,这个函数创建完这个进程后就返回了,也就是说它返回后,该进程不⼀定已经结束
另外,第⼀个参数不能有空格
2.2 使⽤ShellExecute函数
ShellExecute(NULL,"open","","","", SW_HIDE);
2.3 使⽤ShellExecuteEx函数
ShellExecuteEx(SHELLEXECUTEINFO*)函数
其参数是⼀个结构体,具体作⽤还是类似于system的参数,使⽤例⼦:
SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; //确保返回hProcess⽤于了解打开的东西的⽣命周期
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);//等到该进程结束 ,当然可以不等待。。
CloseHandle(ShExecInfo.hProcess) ; //释放资源
3.CreateProcess函数
STARTUPINFO si;
PROCESS_INFORMATION pi;
LPTSTR szCmdline = _tcsdup(TEXT("MyChildProcess"));
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
ZeroMemory(&pi, sizeof(pi));
// Start the child process.
if (!CreateProcess(NULL, // No module name (use command line)
szCmdline, // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
CREATE_NO_WINDOW, // No Console window
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi) // Pointer to PROCESS_INFORMATION structure
)
{
printf("CreateProcess failed (%d)./n", GetLastError());
return;
}
// Wait until child process exits.
WaitForSingleObject(pi.hProcess, INFINITE);
// Close process and thread handles.
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
3、打开msi⽂件(隐藏安装过程)
可以通过bat⽂件,输⼊
xxx.msi /qn
q意思是quiet,n意思是没有⽤户交互
如果通过shell打开的话,注意msi只是个安装⽂件,安装程序为
system(" /i \"E:\\vcredist_x86\\vcredist.msi\" /qn"); (这个会弹⼀个控制台的框system本⾝)
下⾯的⽅法可以啥都不弹。
SHELLEXECUTEINFO ShExecInfo = { 0 };
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = ";//调⽤的程序名
ShExecInfo.lpParameters = L"/i \"E:\\vcredist_x86\\vcredist.msi\" /qn";//调⽤程序的命令⾏参数
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_HIDE;//窗⼝状态为隐藏
ShExecInfo.hInstApp = NULL;
if (!ShellExecuteEx(&ShExecInfo))
{
printf("%d", GetLastError());
}
WaitForSingleObject(ShExecInfo.hProcess,30000);
CloseHandle(ShExecInfo.hProcess);
4、bat⽂件
bat⽂件运⾏时会有⼀个⿊⿊的窗⼝,很吓⼈,就算⽤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 ateObject("wscript.shell")
iReturn=objShell.Run(" /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 激活并显⽰窗⼝。若窗⼝是最⼩化或最⼤化,则恢复到原来的⼤⼩和位置。在还原应⽤程序的最⼩化窗⼝时,应指定该标志。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论