最近工作中需要做一个开机自动启动其他应用的程序。并且要求可以设置是静默启动还是正常启动。这本来是一个比较常见的需求,如果用c++这种底层语言编写,只需要设置窗口属性为SW_HIDE就搞定了。但是公司要求用GO语言实现。虽然golang语言有提供windows系统包,但实际使用起来好像并不是那么好用(可能是自己没有使用好吧)。
网上有人说,隐藏调用的外部程序的cmd窗口,设置cmd属性,可以实现,代码如下:

cmd := exec.Command("cmd")
if runtime.GOOS == "windows" {cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
}

经过多次尝试,没有达到项目需求,我需要寻找新的方法。
后来,我发现在上面exec.Command 参数里面添加start参数,可以显示启动程序,不添加start参数,就是静默启动(母程序本身静默启动)。代码如下:

func StartOtherApp(targetapp string, arg []string, bsilence bool) {var temArg []stringtemArg = append(temArg, "/c")// 非静默启动,添加start参数if !bsilence {temArg = append(temArg, "start")}temArg = append(temArg, targetapp)temArg = append(temArg, arg...)cmd := exec.Command("cmd", temArg...)cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: bsilence}err := cmd.Run()if nil != err {fmt.Println(err)lwlog.Logs.Error(fmt.Sprintf("start exe error:%v", err))return}lwlog.Logs.Info(fmt.Sprintf("start exe:%s", targetapp))fmt.Println("start exe:", targetapp)
}

这样,算是勉强达到需求吧!因为以上代码对带GUI程序是不生效的------不能隐藏GUI程序。虽然,项目上面没有隐藏GUI程序的需求,但是自己总感觉,不完美。
所以,我继续寻找可以隐藏GUI程序的方法。
经过查资料,发现powershell功能十分强大,可以隐藏启动外部程序。这让我十分高兴。
方案是这样的:
第一步,把powershell程序拉起来
第二步,给powershell传入执行参数。powershell支持Command参数,这个参数是“执行指定的命令,就好像他们是在windows powershell 命令提示符下键入的一样”,所以只需要把powershell 中隐藏程序的命令当参数传入即可。
好了,说完了解题思路,还是老规矩----贴上代码.

// 启动其他程序
// 参数1:targetapp,待启动程序路径+名称
// 参数2:arg,待启动程序传入参数
// 参数3:bsilence ,静默启动标识
func StartOtherApp(targetapp string, arg string, bsilence bool) {var temArg []string// 隐藏powershell窗口temArg = append(temArg, "-WindowStyle")temArg = append(temArg, "Hidden")// 启动目标程序temArg = append(temArg, "-Command")temArg = append(temArg, "Start-Process")temArg = append(temArg, targetapp)// 目标程序参数if len(arg) > 0 {temArg = append(temArg, "-ArgumentList")temArg = append(temArg, arg)}// 静默启动参数if bsilence {temArg = append(temArg, "-WindowStyle")temArg = append(temArg, "Hidden")}cmd := exec.Command("PowerShell.exe", temArg...)// 启动时隐藏powershell窗口,没有这句会闪一下powershell窗口cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}err := cmd.Run()if nil != err {fmt.Println(err)lwlog.Logs.Error(fmt.Sprintf("start exe error:%v", err))return}lwlog.Logs.Info(fmt.Sprintf("start exe:%s", targetapp))fmt.Println("start exe:", targetapp)
}

通过本次优化,可以达到隐藏大部分GUI程序了。有很少一部分程序,任然无法被隐藏。通过powershell都无法隐藏程序启动,它既然这么顽强,我们就放过它吧!
如果有朋友恰好需要这个功能,欢迎直接拷贝。

golang 隐藏启动其他程序,包含cmd窗口(黑窗口)程序,GUI程序隐藏相关推荐

  1. C语言打开记事本文件,并向记事本写入字符串,跨程序向cmd命令行窗口写入字符串执行命令

    终于解决了C语言控制cmd窗口,多次发送字符串给cmd执行命令,特此记录一下. 功能1:C语言用线程打开记事本,发送消息给记事本,实现向记事本写入字符 功能2:C语言发送消息给已经打开的cmd窗口,实 ...

  2. python打包成exe闪退_脚本程序打包后,黑框一闪而过,程序不能运行

    源程序的链接是我另一个求助帖:https://fishc.com.cn/forum.php?m ... p;page=1#pid4988050 源程序已经完美解决,能够在pycharm实现了,再次感谢 ...

  3. python文本菜单程序_从〇到一: Python GUI 程序:记事本

    本示例程序 mynote.pyw 实现了一个简易的记事本,可以像 Windows 系统自带的记事本一样编辑文本文件.程序使用的可视化部件有菜单(Menu).带滚动条的文本区(ScrolledText) ...

  4. C#程序调用cmd执行命令

    酷小孩 原文 C#程序调用cmd执行命令 对于C#通过程序来调用cmd命令的操作,网上有很多类似的文章,但很多都不行,竟是漫天的拷贝.我自己测试整理了一下. 代码: string str = Cons ...

  5. Windows 批处理文件bat执行完自动退出cmd黑窗口

    碰见一个很尴尬的事情,有一个从一个文件夹复制一些文件到另一个文件的批处理文件,每次执行复制完之后还需要手动点击关闭cmd.exe黑窗口,很麻烦.看到网上其他先行者说的比较多的解决方案是在bat文件末尾 ...

  6. python的gui界面 可视化_使用可视化设计窗体的GUI程序

    示例Demo2_1用PyQt5的一些类创建了一个简单的GUI应用程序,窗体及窗体上的标签对象的创建和属性设置都完全由代码完成.显然这种纯代码方式构造UI的方式是比较麻烦的,特别是在窗体上组件比较多.层 ...

  7. 微信小程序支付功能用服务器吗,微信小程序 支付功能 服务器端(TP5.1)实现...

    首先下载微信支付SDK ,将整个目录的文件放在 /application/extend/WxPay 目录下 在使用SDK之前我们需要对 WxPay.Config.php 进行配置 namespace ...

  8. access 子窗体 鼠标滚动不工作_使用可视化设计窗体的GUI程序

    示例Demo2_1用PyQt5的一些类创建了一个简单的GUI应用程序,窗体及窗体上的标签对象的创建和属性设置都完全由代码完成.显然这种纯代码方式构造UI的方式是比较麻烦的,特别是在窗体上组件比较多.层 ...

  9. 运行java黑窗口是什么意思_黑窗口运行java文件步骤

    误区纠正:运行java文件可以不用配置jdk环境变量,配置jdk只是为了方便运行时找到它 未配置环境变量运行java程序步骤: 1.安装jdk,在G盘下建一个java文件测试类 2.win+r 快捷键 ...

  10. pythongui程序,python第一个GUI程序

    第一个GUI程序 截止目前,我们的python基本语法就已经讲完了,但是python的应用确实无比之广,不同的应用领域需要学习不同的Python库,比如爬虫的urllib模块,科学计算numpy模块, ...

最新文章

  1. leetcode-79-单词搜索(用dfs解决)
  2. Kafka: Connect
  3. SqlServer中bit类型的性别的一些问题
  4. 用html通过python调用mysql_HTTP协议与使用Python获取数据并写入MySQL
  5. openFeign 服务接口的调用03—— OpenFeign 超时控制
  6. cadshx字体怎么安装_福利 | 关于PPT字体,你应该知道的几件事...字体包福利见文末...
  7. python中的__iter__ __reversed__ __next__
  8. 电信信息日志使用mapreduce统计的两种方式
  9. 备份ad_IT管理公开课——备份恢复解决方案
  10. 【Rényi差分隐私和零集中差分隐私(差分隐私变体)代码实现】差分隐私代码实现系列(九)
  11. wireshark抓组播数据_HCIE学习笔记--组播路由协议PIM-DM工作机制解析
  12. CMS GC 垃圾回收
  13. DSP与单片机的区别
  14. 物联网——射频识别技术的应用
  15. [转]中国象棋谚语大全
  16. 解决Eth0网卡不存在的情况_wuli大世界_新浪博客
  17. 测试结果OK、NG、NT、POK的意思
  18. 浪潮服务器硬盘阵列怎么做,浪潮智能RAID技术为数据存储保驾护航
  19. [STM32] Stm32f103c8t6+RC522 实现读卡写卡功能(超详细,零基础,小白)
  20. 最新Exsi-6.7.0U3b版本下载

热门文章

  1. (*长期更新)软考网络工程师学习笔记——Section 13 Linux网络配置命令
  2. Linux玩dota2需要什么显卡,dota2最低配置要求 玩dota2需要什么电脑配置
  3. 教你如何写原创歌词和卖你的原创歌曲
  4. 基于STM32的光照度自动调节系统
  5. 几何光学学习笔记(30)-6.5光通量和光亮度在光学系统中的传递、像面光照度
  6. 【编程题训练】统计射击比赛成绩
  7. 9367: 【动态规划】雷涛的小猫
  8. abap --MOVE-CORRESPONDING
  9. 【无标题】通信系统的有效性和可靠性
  10. .bat文件批处理命令语法格式ech,goto,set,for,call,choise,at,set,定时关机命令