我有一个备份应用程序,它将在备份之前关闭用户定义的正在运行的程序,以便在备份之前关闭和刷新打开的数据文件。备份完成后,它会重新启动列表中的程序。
使用标题和PostMessage(AppHandle,WM_CLOSE,0,0)获取窗口句柄没有问题;这对大多数应用程序都适用,但对于在通知区域(系统托盘)中运行的应用程序则不适用。
目前我正在使用TerminateProcess(它适用于那些Notification Area应用程序,但它会让文件处于打开状态,因为Windows会绕过任何关闭指令,直接关闭这些应用程序。
我已经苦苦寻找了很长时间,我找不到更好的方法来关闭Notification Area应用程序。有人能帮帮忙吗?
谢谢
发布于 2011-06-18 06:46:42
为了优雅地关闭程序,您需要了解该程序期望如何关闭。如果关闭主窗口就可以做到这一点,那么你需要知道如何识别“主”窗口。
程序不会“在”通知区域运行。他们在那里显示图标。任何带有通知图标的程序都必须有一个窗口(因为shell通过向窗口发送消息来告诉程序图标已被单击)。即使窗口不可见,它也必须存在。如果您可以确定标识与特定通知图标相关联的窗口的某些属性集,则可以关闭该窗口。但是,没有标准的属性集可供查找;每个程序都可以不同地执行此操作。
即使你找到了你正在寻找的窗口,关闭它也可能不是程序预期的终止方式。它可能希望从通知图标的菜单中获得某个命令,或者通过程序显示的对话框发送一些消息。
发布于 2011-06-18 07:28:21
如果你的应用程序运行在Windows Vista或Windows7上,请不要关闭程序,而是使用Volume Shadow Copy service在文件仍在使用时访问它们的快照。这就是Windows 7内置备份程序的功能。
如果你使用的是早期版本的Windows,没有万无一失的解决方案。如果程序有一个系统托盘图标,它也会有一个隐藏的窗口,你可以试着向它发送WM_QUERYENDSESSION和WM_ENDSESSION。但是,没有人保证程序会关闭,如果它确实关闭了,因为您可能会绕过其正常关闭过程的一部分,所以它可能无法完成正常的清理。也可能有程序在运行时根本没有关联的窗口。最好的方法可能是简单地注销用户,然后从服务进程执行备份。当然,对于其他服务打开的文件,您仍然会遇到共享问题...
https://stackoverflow.com/questions/6392344
复制相似问题