3

在 InnoSetup 中,有一个函数“FindWindowByClassName”可以知道程序是否已经在使用中。就我而言,我想在运行 InnoSetup 更新之前知道我的 wpf 应用程序是否正在使用中,但我不知道如何知道我的 wpf 应用程序类名。当我在我的应用程序中使用 Spy++ 时,类名是:

HwndWrapper[MuProgram.exe;;1120a18a-2e29-4e19-8653-939c99b505c2]

如您所见,我的类名中有一个 GUID,并且此 GUID 在每次启动时都会更改。但无论如何,当我运行 InnoSetup(在调试模式下)时,FindWindowByClassName 函数在我使用这个类名时返回 0。

FindWindowByClassName('HwndWrapper[MyProgram.exe;;1120a18a-2e29-4e19-8653-939c99b505c2]'); // returns 0

我尝试只使用“MyProgram.exe”,但该函数总是返回 0(在测试期间启动应用程序“MyProgram.exe”)。你有什么想法来解决这个问题吗?我可以在我的 wpf 代码中设置类名吗?

4

1 回答 1

1

Inno Script 源代码中,可以看到 FindWindowByClassName 调用了 Windows FindWindow函数。正如您已经注意到的,WPF 表单在每次调用时都会更改类名。根据这个 StackOverflow 答案,随机 GUID 使得无法在 WPF 类上使用 FindWindow。

不幸的是,搜索窗口时没有 RegEx 或通配符功能。我想您可以通过使用GetWindowEx之类的东西搜索所有窗口并循环遍历桌面窗口的所有子窗口来编写自己的代码。这个 StackOverflow 答案建议使用 UI 自动化而不是使用 WPF 的旧 API 调用。

如果您正在编写要搜索的应用程序,@TLama 建议的互斥锁替代方案非常棒。如果您尝试查找并关闭其他供应商的应用程序,这并不容易。CheckForMutexs也不返回窗口句柄,因此如何关闭窗口并不简单。

于 2015-12-31T03:53:37.680 回答