Powershell 向CMD窗口发送CTRL+C(优雅结束控制台应用程序)

Powershell 向CMD窗口发送CTRL+C(优雅结束控制台应用程序)

01 前言

Windows下在通过命令行使用ffmpeg进行屏幕录制的时候,碰到一个问题:如何通过命令来结束录屏。直接taskkill /IM ffmpeg.exe /F强制结束ffmpeg.exe进程是不行的,会导致无法正常生成录制文件(即便生成了也因文件流不完整而无法正常播放)。

由于ffmpeg.exe会默认打开一个控制台应用程序,而结束这类控制台程序(又比如Tomcat)的一般做法就是使用快捷键Ctrl+C来实现。查了一些资料,可以通过Windows API来模拟Ctrl+C信号。

02 正文

环境

Windows 11,64bit

PSVersion 5.1

使用到win32的4个API:GenerateConsoleCtrlEventSetConsoleCtrlHandlerAttachConsoleFreeConsole,powershell版本代码如下:

powershell 复制代码
<#
通过Windows API模拟Ctrl+C结束控制台应用程序

By hokis
On 2025-12-21 18:36

#>

$code = @'
[DllImport("kernel32.dll")]
public static extern bool GenerateConsoleCtrlEvent(int dwCtrlEvent, int dwProcessGroupId);
[DllImport("kernel32.dll")]
public static extern bool SetConsoleCtrlHandler(IntPtr handlerRoutine, bool add);
[DllImport("kernel32.dll")]
public static extern bool AttachConsole(int dwProcessId);
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool FreeConsole();
'@

#引入API
$myAPI = Add-Type -MemberDefinition $code -Name myAPI -PassThru

#目标进程
$targetProcess = Get-Process -Name 'ffmpeg' -ErrorAction SilentlyContinue
if(-not $targetProcess){
    Write-Host 'Not found target process.'
    exit(1)
}

[void]$myAPI::FreeConsole()

if(($myAPI::AttachConsole($targetProcess.Id))){
    #设置自己的ctrl+c处理,防止自己被终止
    [void]$myAPI::SetConsoleCtrlHandler([IntPtr]::Zero, $true)

    #发送ctrl+c(注意:这是向所有共享该console的进程发送)
    if($myAPI::GenerateConsoleCtrlEvent(0, 0)){
        #等待处理
        Sleep -Seconds 10
        #重置此参数
        [void]$myAPI::SetConsoleCtrlHandler([IntPtr]::Zero, $false)
    }
}

Write-Host 'Done...'

另存为run.ps1,右键,选择"使用PowerShell运行"即可

其他玩法可以自行扩展。

03 后记

又可以愉快玩耍了。

参考:
c# Process 发送Ctrl + C

相关推荐
阿里巴啦2 天前
python+yt-dlp开源项目,支持 YouTube, Bilibili, TikTok/抖音,快手 等多个平台的视频/音频/字幕下载/ai摘要等功能
python·ffmpeg·whisper·音视频·视频处理·ai摘要·音视频转录
来鸟 鸣间3 天前
linux下ffmpeg源码编译
linux·运维·ffmpeg
Echo_NGC22373 天前
【FFmpeg使用指南】Part 2:滤镜图架构与信号处理
架构·ffmpeg·音视频·信号处理
Echo_NGC22373 天前
【FFmpeg使用指南】Part 1:核心架构与媒体流处理
ffmpeg·音视频·媒体·视频
ssxueyi3 天前
用 Claude Code 从零开发自己的Direct3D 硬件加速播放器
ffmpeg·ai编程·directx·视频播放器·从零开始·claude code·csdn征文活动
Yan_uuu3 天前
ubuntu18.04 安装 x264、ffmpeg、nv-codec-hearers 支持GPU硬件加速
c++·图像处理·ubuntu·ffmpeg
runner365.git3 天前
做一个基于ffmpeg的AI Agent智能体
人工智能·ffmpeg·大模型
彷徨而立3 天前
【FFmpeg】理解 av_packet_from_data 和 av_packet_unref 接口
ffmpeg
runner365.git4 天前
ffmpeg8.0合入whisper,语音识别模型终于进入ffmpeg
ffmpeg·whisper·语音识别
小徐敲java5 天前
视频推流服务器与FFmpeg 安装配置
服务器·ffmpeg·音视频