Winapi 通过检查窗口类名来区分Word和Outlook

Winapi 通过检查窗口类名来区分Word和Outlook,winapi,ms-word,outlook,inno-setup,findwindow,Winapi,Ms Word,Outlook,Inno Setup,Findwindow,我有一个InnoSetup安装程序脚本,它试图在继续安装之前关闭任何打开的Word窗口,方法是查找具有OpusApp类名的顶级窗口。脚本还无意中检测并关闭了Outlook compose窗口,因为这些窗口打开了隐藏的Word窗口,其中也包含OpusApp类名。(我使用该实用程序检查打开的窗口的类名。) 有什么方法可以区分“真实”Word窗口和带有隐藏Word窗口的Outlook compose窗口?如果它涉及从我的安装程序脚本调用一个额外的工具,我可能会处理这个问题 顺便说一下,当我让我的安装

我有一个InnoSetup安装程序脚本,它试图在继续安装之前关闭任何打开的Word窗口,方法是查找具有
OpusApp
类名的顶级窗口。脚本还无意中检测并关闭了Outlook compose窗口,因为这些窗口打开了隐藏的Word窗口,其中也包含
OpusApp
类名。(我使用该实用程序检查打开的窗口的类名。)

有什么方法可以区分“真实”Word窗口和带有隐藏Word窗口的Outlook compose窗口?如果它涉及从我的安装程序脚本调用一个额外的工具,我可能会处理这个问题


顺便说一下,当我让我的安装程序关闭
OpusApp
窗口时,Outlook邮件撰写窗口将崩溃(即,用户无法再查看和编辑文本,但文本不会丢失)——这是安装Word加载项的一个不希望出现的副作用

查找winword.exe进程,而不是查找具有特定标题或类名的窗口。

查找winword.exe进程,而不是查找具有特定标题或类名的窗口。

尝试关闭打开的应用程序不是一个好主意。即使它与Word 2016配合使用,也可能与Word 2017不配合使用,因为窗口类名可能是“OpusApp2”。我只需要检测Word是否打开,并要求用户在继续之前关闭Word。很多安装人员都是这样做的。@MichaelWalz Point很好,我会考虑的。另一方面:除了PowerPoint,Office windows类名称似乎多年来没有变化。但是你当然是对的,微软可以随时决定改变它。你为什么需要它呢?如果Word锁定了一些文件,Inno安装程序将检测到并自动关闭Word。我同意Michael的说法,但是。。。检查标题栏。Word窗口将包含文档名和“Microsoft Word”。(当然,这在将来也可能改变。)@MartinPrikryl我正在安装一个VSTO插件。如果在目标Office应用程序运行时设置外接程序注册表项,则下次启动应用程序时将不会加载外接程序,这会使用户感到困惑。他们希望外接程序在安装(并重新启动Office应用程序)后处于活动状态。尝试关闭打开的应用程序不是一个好主意。即使它与Word 2016配合使用,也可能与Word 2017不配合使用,因为窗口类名可能是“OpusApp2”。我只需要检测Word是否打开,并要求用户在继续之前关闭Word。很多安装人员都是这样做的。@MichaelWalz Point很好,我会考虑的。另一方面:除了PowerPoint,Office windows类名称似乎多年来没有变化。但是你当然是对的,微软可以随时决定改变它。你为什么需要它呢?如果Word锁定了一些文件,Inno安装程序将检测到并自动关闭Word。我同意Michael的说法,但是。。。检查标题栏。Word窗口将包含文档名和“Microsoft Word”。(当然,这在将来也可能改变。)@MartinPrikryl我正在安装一个VSTO插件。如果在目标Office应用程序运行时设置外接程序注册表项,则下次启动应用程序时将不会加载外接程序,这会使用户感到困惑。他们希望外接程序在安装(并重新启动Office应用程序)后处于活动状态。这对我来说是合理的。这对我来说是合理的。