【发布时间】:2013-08-07 15:42:40
【问题描述】:
在 Visual Basic 中,我创建一个应用程序对象并启动它:
gApp = New CANoe.Application
gMeasurement = gApp.Measurement
gApp.Open(arrArgs(0), False, False)
gMeasurement.Start()
应用程序完成数据处理后,可能会发生两种可能的情况:(i) 数据文件已损坏,并且(在正常情况下)会出现警报窗口,以及 (ii) 数据文件正常。在 (ii) 情况下,我可以使用 gApp.Quit() 完成应用程序。但是,如果 (i) gApp.Quit() 不起作用,因为程序需要用户输入(尽管通常我根本看不到窗口)。
问题1:如何比较gApp对应的流程?目前我正在以这种方式退出:
For Each p As Process In Process.GetProcesses
If p.ProcessName = "CANoe32" Then
p.Kill()
End If
Next
通常这是一个糟糕的解决方案,因为可能会运行更多的 CANoe32 实例(尽管在这种特殊情况下,系统上只能运行此二进制文件的一个进程)。
问题 2 如果 gApp 有子窗口,那么退出 gApp 的更优雅的解决方案是什么?
任何cmets都非常有帮助
【问题讨论】:
-
如果给定的程序没有响应(因为期望用户输入),你唯一能做的就是杀死它(就像你正在做的那样)。关于子窗口,它们由外部程序自己管理,因此在主程序关闭时也会关闭。
-
@varocarbas:非常感谢您的评论。检查天气有儿童窗户有多难?是否可以更好地获得
Application对应的Process(无需扫描整个系统进程列表? -
无法对这个问题给出一般性的答案。如前所述,子窗口由目标应用程序管理,因此它们的行为由它决定。仅当目标应用程序为每个子窗口创建一个新进程时,您才可以通过进程管理子窗口(例如:具有您打开的不同实例的 Excel);否则,您只能通过 gApp 访问它们(如果允许这样做)。总而言之,对于这类事情,您有两种选择:询问对此特定应用程序有经验的人或进行一些反复试验/测试。
标签: vba kill-process raiserror raiseevent