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


    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 ”

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

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

                

               

      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 激活并显示窗口。若窗口是最小化或最大化,则恢复到原来的大小和位置。在还原应用程序的最小化窗口时,应指定该标志。

  • 相关阅读:
    python之路_socketserver模块
    java 字符串String操作工具类
    maven常用插件
    查杀oracle锁表
    正则表达式汇总
    javascript 数组操作
    javascript中sleep等待实现
    js获取服务端IP及端口及协议
    log4j中的MDC和NDC
    如何设置(修改)jetty(maven插件maven-jetty-plugi)的端口
  • 原文地址:https://www.cnblogs.com/xuhuajie/p/11245708.html
Copyright © 2020-2023  润新知