分享

exe、msi、dos、bat等静默运行,后台运行,不弹窗的解决办法

 金刚光 2023-02-04 发布于辽宁

摘要:

ShExecInfo.cbSize=sizeof(SHELLEXECUTEINFO)//确保返回hProcess

... 展开

1、exe程序本身不想显示,

        在源码开头中加入   #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 ”

            但是这个有一个问题,这个函数创建完这个进程后就返回了,也就是说它返回后,该进程不一定已经结束

            另外,第一个参数不能有空格

            exe、msi、dos、bat等静默运行,后台运行,不弹窗的解决办法第1张

  2.2 使用ShellExecute函数

            ShellExecute(NULL,"open","calc.exe","","", 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只是个安装文件,安装程序为msiexec.exe

            system("msiexec.exe /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 = L"Msiexec.exe";//调用的程序名
    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文件运行时会有一个黑黑的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 激活并显示窗口。若窗口是最小化或最大化,则恢复到原来的大小和位置。在还原应用程序的最小化窗口时,应指定该标志。

标签:#参数#cmd#NULL#amp | 浏览:3 | 发布日期:2022-12-22

免责声明:文章转载自《exe、msi、dos、bat等静默运行,后台运行,不弹窗的解决办法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Duilib的圆角矩形 抗锯齿优化 弥补RoundRect不足(网易云信borderround版本)删除桌面上有文件但提示项目不存在的方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

使用Nginx+Lua实现waf

使用Nginx+Lua实现waf 软件包需求: 1 、Nginx兼容性【最后测试到1.13.6】 wget http:///download/nginx-1.13.6.tar.gz 2 、PCRE为Nginx编译安装关系的依赖 wget https://jaist.dl./project/pcre/pc...

docker中连接sqlserver 2008R2(SP3) 失败解决方法

在dockerfile 中添加下面内容注意换行 RUN sed -i 's/MinProtocol = TLSv1.2/MinProtocol = TLSv1/' /etc/ssl/openssl.cnf && sed -i 's/CipherString = DEFAULT@SECLEVEL=2/CipherString = DEFAU...

UVa 1332

题目链接:https:///index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4078 很容易列出方程组,但因为模数并不一定是质数,可能不存在逆元,因此用辗转相除法来消元 每个齿轮一定不会转动超过 (n) 下(鸽巢原理...

UVa 11361 Investigating Div-Sum Property (数位dp)

题目链接:https:///index.php?option=com_onlinejudge&Itemid=8&category=25&page=show_problem&problem=2346 唯一的问题就是 (k) 太大数组开不下,但发现所有位数之和最多不会超过 (90),也就是 (k)...

Python中getopt()函数的使用

在运行程序时,可能需要根据不同的条件,输入不同的命令行选项来实现不同的功能。目前有短选项和长选项两种格式。短选项格式为"-"加上单个字母选项;长选项为"--"加上一个单词。长格式是在Linux下引入的。许多Linux程序都支持这两种格式。在Python中提供了getopt模块很好的实现了对这两种用法的支持,而且使用简单。 取得命令行参数  在使用之前,首先要...

查看端口是否被占用

经常遇到80端口被占用的问题,那么我们如何查看某端口是否被占用呢?然后如何知道这个端口被什么程序占用呢? 以80端口举例来说明: 1. “开始”-> “运行”,cmd进入命令行。 2. 命令 netstat -ano 查看所有端口的情况 3. netstat - ano|findstr "80"  查看80端口被谁占用    TCP     127.0...

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多