如何捕获Notepad会话关闭事件?基于Windows Embedded Standard 7与TwinCAT3环境
捕获Notepad关闭事件并触发指定程序的可行方案(Windows Embedded Standard 7 + TwinCAT3环境)
针对你的场景,我整理了几个实用的方案,你可以根据自己的开发习惯和需求来选择:
方案1:编写进程监控程序(可集成到TwinCAT3项目)
因为你在Visual Studio里用TwinCAT3开发,最直接的方式是写一个轻量的监控程序,跟踪notepad.exe的退出事件。这里给你一个C#的示例(可以直接放到TwinCAT的C#项目中,或者单独编译成EXE):
using System; using System.Diagnostics; using System.Threading.Tasks; class NotepadExitMonitor { static async Task Main(string[] args) { // 目标进程名(不带.exe后缀) string targetProcess = "notepad"; // 替换成你要自动运行的程序路径 string programToLaunch = @"C:\Your\Target\Program.exe"; while (true) { // 查找当前运行的所有记事本进程 Process[] activeNotepads = Process.GetProcessesByName(targetProcess); foreach (var proc in activeNotepads) { // 等待该记事本进程退出 await Task.Run(() => proc.WaitForExit()); // 进程退出后启动指定程序 Process.Start(programToLaunch); } // 每秒检查一次,避免占用过多CPU资源 await Task.Delay(1000); } } }
注意事项:
- 如果需要监控多个Notepad实例,这个代码会在每个实例退出时都触发程序;如果只需要全局触发一次,可以调整逻辑(比如记录已监控的进程ID,避免重复处理)
- 可以把这个程序设置为Windows开机自启:放到
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup文件夹,或者添加到注册表HKLM\Software\Microsoft\Windows\CurrentVersion\Run项中 - Windows Embedded Standard 7需要确保已安装.NET Framework(对应你编译代码的版本)
方案2:利用Windows任务计划程序(无代码方案)
如果你不想写代码,可以用Windows自带的任务计划程序,通过监控系统事件日志来触发程序:
- 打开任务计划程序,点击「创建任务」
- 在「触发器」选项卡,点击「新建」,选择「当特定事件被记录时」:
- 日志选择「系统」,来源选择「EventLog」,事件ID填写「109」(这个ID对应进程终止事件)
- 点击「编辑事件筛选器」,切换到「XML」标签,粘贴以下筛选规则(过滤出Notepad的退出事件):
<QueryList> <Query Id="0" Path="System"> <Select Path="System">*[System[Provider[@Name='EventLog'] and EventID=109]] and *[EventData[Data='notepad.exe']]</Select> </Query> </QueryList>
- 在「操作」选项卡,点击「新建」,选择「启动程序」,填写你要运行的程序路径和参数
- 在「设置」选项卡,勾选「不管用户是否登录都要运行」(如果需要后台执行),并确保「如果任务失败,重新启动」的选项符合你的需求
注意事项:
- 确保Windows Embedded Standard 7的「事件日志」服务和「任务计划程序」服务已启用
- 部分Embedded系统可能精简了事件日志功能,需要先确认系统能记录进程终止事件
方案3:结合TwinCAT3自动化接口(联动PLC逻辑)
如果需要把Notepad关闭事件和TwinCAT3的PLC程序联动(比如触发PLC内部逻辑),可以用TwinCAT的.NET ADS接口来实现:
using System; using System.Diagnostics; using System.Threading.Tasks; using TwinCAT.Ads; class TcNotepadMonitor { static async Task Main(string[] args) { string targetProcess = "notepad"; string programToLaunch = @"C:\Your\Target\Program.exe"; // 连接本地TwinCAT ADS服务器(默认端口851) using (TcAdsClient adsClient = new TcAdsClient()) { adsClient.Connect(851); while (true) { Process[] activeNotepads = Process.GetProcessesByName(targetProcess); foreach (var proc in activeNotepads) { await Task.Run(() => proc.WaitForExit()); // 启动指定程序 Process.Start(programToLaunch); // 可选:给PLC变量写入值,通知事件发生(比如MAIN块的bNotepadClosed变量) adsClient.WriteAny("MAIN.bNotepadClosed", true); } await Task.Delay(1000); } } } }
注意事项:
- 需要在TwinCAT项目中引用
TwinCAT.Ads.dll(通常在TwinCAT安装目录下) - 确保TwinCAT运行时已在Windows Embedded Standard 7中正确安装并启动
- PLC变量需要提前在TwinCAT工程中定义,并且权限设置允许外部写入
内容的提问来源于stack exchange,提问作者Mike Kohlberg
相关产品推荐
相关产品推荐

