废话不多说直接上代码,很多人在写程序时双击打开都会一闪而逝,因此都会在程序执行最后加上获取输入的代码。但是命令行时又不想再敲一次回车。下面代码就能解决你的烦恼,原理就是判断父进程是否为cmd.exe,如果不是则说明不是命令行打开,则加上获取输入回车。 package main import ( fmt syscall unsafe ) func main() { if name, err := getParentProcessName(); err == nil && name != cmd.exe { defer fmt.Scanln() // 不是命令行时避免一 标题中的“双击打开避免一闪而逝,命令行自动忽略”指的是在编写程序时,当程序以可执行文件形式双击打开时,由于程序执行快速完成,窗口可能会瞬间关闭,导致用户无法看到输出结果。为了解决这个问题,通常会在程序末尾添加获取用户输入的代码,使程序暂停等待用户按下回车键。然而,如果是在命令行环境中运行程序,我们并不希望每次执行都需要额外输入回车。这个描述提供了一个解决方案,即通过判断父进程是否为`cmd.exe`来决定是否需要等待用户输入。 代码中使用了Go语言编写,主要涉及以下几个知识点: 1. **进程管理**:通过`syscall`包和`unsafe`包来访问系统底层的进程信息。`syscall.CreateToolhelp32Snapshot`函数用于创建一个进程快照,这样可以遍历当前系统中的进程信息。`syscall.TH32CS_SNAPPROCESS`常量表示需要捕获进程的快照。 2. **进程快照遍历**:`syscall.Process32First`和`syscall.Process32Next`函数分别用于获取快照中的第一个进程条目和下一个进程条目。`syscall.ProcessEntry32`结构体包含了进程的相关信息,如进程ID、父进程ID以及可执行文件名。 3. **父进程名称获取**:`getParentProcessName`函数用于获取当前进程的父进程名称。通过`syscall.Getpid()`获取当前进程的ID,然后遍历进程快照,查找与当前进程ID匹配的父进程ID,最后根据父进程ID获取其进程名称。 4. **字符串处理**:`syscall.UTF16ToString`函数将UTF-16编码的字节切片转换为Go语言中的字符串类型。 5. **错误处理**:在调用系统函数时,需要检查返回的错误值,确保操作成功。如`err != nil`表示出现错误,需要返回或处理。 6. **延迟函数调用**:`defer fmt.Scanln()`语句被放在`if`语句中,当条件满足(即父进程不是`cmd.exe`)时,会在`main`函数返回前执行,这使得在非命令行环境下程序不会立即结束,而是等待用户输入并按回车后才退出。 总结来说,这段代码提供了一种方法,能够在双击执行程序时保持命令行窗口不立即关闭,同时在命令行环境中正常运行,避免了不必要的用户交互。这种解决方案对于编写需要在不同环境下运行的命令行程序非常有用。
- 粉丝: 4
- 资源: 960
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 通信原理-AMI编译码(归零码)实验报告
- python基于PyTorch的新闻数据集文本分类实战项目源代码+数据集(高分项目)
- CUMT自然语言处理报告-基于DB和DB++的文本检测优化
- vscode,linux下的安装包 (旧)
- AIGC问答项目-基于本地知识库的问答系统python源码+运行教程(支持多种文件格式,离线安装和使用).zip
- 基于CNN网络实现的新闻数据集文本分类python源码+数据集(高分项目)
- 基于python实现的交通异常情况识别,包含交通事故,速度检测,动物识别等+源码(毕业设计&课程设计&项目开发)
- Opencv+ROS自编相机驱动
- python绘制爱心表白专用
- 基于Jupyter实现的深圳市道路交通事故数据分析+源码(毕业设计&课程设计&项目开发)
评论0