VB 常用工具类:ProcessWindowHelper 进程窗口工具类
在 VB 开发里,进程与窗口操作总像 “隔空控物”—— 想启动外部程序得处理路径和参数,查找指定窗口要调用复杂 API,调整窗口大小还得面对晦涩的句柄操作。之前做一个数据同步工具时,为了启动 Excel 并让它在后台运行,手动写了一堆Process相关代码,结果要么 Excel 弹窗挡住主程序,要么关闭时残留进程,排查半天发现是没正确处理窗口状态。今天要分享的 ProcessWindowHelper 工具类,就是专门打通进程与窗口操作 “壁垒” 的利器,不管是启动外部程序、精准控制窗口,还是清理残留进程,有了它都能一步到位,让进程窗口管理像操作本地控件一样简单!
基础功能:轻松启动与管理进程
先看最常用的外部程序启动,比如启动记事本并打开指定文件。以前得手动创建ProcessStartInfo对象,处理路径合法性,现在用 ProcessWindowHelper,一行代码就能搞定:
' 启动记事本并打开D盘的日志文件
Dim notepadProcess As Process = ProcessWindowHelper.StartProcess(
exePath:="notepad.exe", ' 程序路径(系统自带程序可直接写文件名)
arguments:="D:\log.txt", ' 启动参数(打开指定文件)
windowStyle:=ProcessWindowStyle.Normal ' 窗口样式(正常显示)
)
' 输出进程ID:便于后续管理
Console.WriteLine($"记事本进程ID:{notepadProcess.Id}")
要是想启动程序后让它后台运行(不显示窗口),比如启动命令行执行脚本,只需调整windowStyle参数:
' 启动命令行并执行批处理脚本(后台运行,不显示黑窗口)
ProcessWindowHelper.StartProcess(
exePath:="cmd.exe",
arguments:="/c D:\run_script.bat", ' /c表示执行完命令后关闭窗口
windowStyle:=ProcessWindowStyle.Hidden ' 隐藏窗口
)
管理已启动的进程也很方便,比如根据进程 ID 关闭指定程序:
' 关闭指定ID的进程(比如之前启动的记事本,假设ID为1234)
Dim isClosed As Boolean = ProcessWindowHelper.KillProcess(1234)
If isClosed Then
Console.WriteLine("记事本进程已成功关闭")
Else
Console.WriteLine("进程不存在或已关闭")
End If
' 批量关闭指定名称的进程(比如关闭所有记事本进程)
Dim closedCount As Integer = ProcessWindowHelper.KillProcessesByName("notepad.exe")
Console.WriteLine($"共关闭{closedCount}个记事本进程")
核心能力:精准控制窗口状态
启动程序后,经常需要调整窗口大小、位置,或者隐藏 / 显示窗口。用 ProcessWindowHelper 不用再调用User32.dll的底层 API,直接通过进程 ID 或窗口标题就能控制:
' 1. 根据窗口标题查找窗口句柄(支持模糊匹配,比如查找标题含“日志”的窗口)
Dim logWindowHandle As IntPtr = ProcessWindowHelper.FindWindowByTitle("日志")
If logWindowHandle <> IntPtr.Zero Then
Console.WriteLine($"找到窗口,句柄:{logWindowHandle}")
' 调整窗口大小:宽800,高600
ProcessWindowHelper.SetWindowSize(logWindowHandle, 800, 600)
' 移动窗口位置:左上角坐标(100, 100)
ProcessWindowHelper.MoveWindow(logWindowHandle, 100, 100)
' 让窗口置顶显示
ProcessWindowHelper.SetWindowTopMost(logWindowHandle, True)
Else
Console.WriteLine("未找到目标窗口")
End If
' 2. 根据进程ID控制窗口(比如最小化指定进程的窗口)
Dim targetProcessId As Integer = 5678 ' 目标进程ID
ProcessWindowHelper.SetWindowStateByProcessId(
processId:=targetProcessId,
windowState:=WindowState.Minimized ' 最小化窗口
)
' 3. 隐藏/显示窗口(比如隐藏命令行窗口,仅保留后台运行)
Dim cmdWindowHandle As IntPtr = ProcessWindowHelper.FindWindowByTitle("命令提示符")
If cmdWindowHandle <> IntPtr.Zero Then
ProcessWindowHelper.ShowWindow(cmdWindowHandle, False) ' 隐藏窗口
' 后续需要显示时调用:ProcessWindowHelper.ShowWindow(cmdWindowHandle, True)
End If
实用场景:进程信息查询与窗口交互
开发系统监控工具或自动化脚本时,经常需要查询进程详情或模拟窗口操作。ProcessWindowHelper 也能轻松应对这些场景:
' 1. 查询进程详情(比如获取Chrome浏览器的进程信息)
Dim chromeProcesses() As ProcessInfo = ProcessWindowHelper.GetProcessInfoByName("chrome.exe")
For Each process In chromeProcesses
Console.WriteLine($"进程ID:{process.ProcessId}")
Console.WriteLine($"窗口标题:{process.MainWindowTitle}")
Console.WriteLine($"启动路径:{process.ExePath}")
Console.WriteLine($"内存占用:{process.MemoryUsageMB:F2}MB")
Console.WriteLine("------------------------")
Next
' 2. 模拟窗口点击(比如点击“确定”按钮,需知道按钮在窗口内的相对坐标)
Dim dialogHandle As IntPtr = ProcessWindowHelper.FindWindowByTitle("提示")
If dialogHandle <> IntPtr.Zero Then
' 模拟点击窗口内(150, 80)坐标处的按钮(假设“确定”按钮在此位置)
ProcessWindowHelper.SimulateMouseClick(dialogHandle, 150, 80)
End If
' 3. 向窗口发送键盘输入(比如向记事本窗口输入文本)
Dim notepadHandle As IntPtr = ProcessWindowHelper.FindWindowByTitle("log.txt - 记事本")
If notepadHandle <> IntPtr.Zero Then
' 先激活窗口,再发送文本
ProcessWindowHelper.ActivateWindow(notepadHandle)
ProcessWindowHelper.SendKeyInput(notepadHandle, "新增日志:" & DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"))
End If
我之前做一个自动化测试工具时,用 ProcessWindowHelper 处理所有外部程序交互,原本 200 多行的进程启动、窗口控制代码,最后缩减到了 60 多行。不仅解决了之前 “窗口找不到”“进程残留” 的问题,还让测试脚本的执行效率提升了 50%。有次需要批量关闭测试环境的多余 Chrome 进程,用它的KillProcessesByName方法,一行代码就清理了 20 多个残留进程,比手动打开任务管理器逐个关闭高效太多。不管你是做自动化工具、系统监控软件,还是需要与外部程序交互的应用,ProcessWindowHelper 都能帮你把复杂的进程窗口操作变简单,让你轻松掌控外部程序的运行状态!