gpt4 book ai didi

wpf - 如何知道要在 FindWindowByClassName InnoSetup 函数中使用的 WPF 应用程序的类名

转载 作者:行者123 更新时间:2023-12-02 06:58:28 51 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

Inno Script source code ,您可以看到 FindWindowByClassName 调用了 Windows FindWindow功能。正如您已经注意到的,WPF 表单会在每次调用时更改类名称。根据this StackOverflow answer ,随机 GUID 使得无法在 WPF 类上使用 FindWindow。

不幸的是,搜索窗口时没有正则表达式或通配符功能。我想您可以通过使用类似 GetWindowEx 搜索所有窗口来编写自己的代码。并循环遍历桌面窗口的所有子窗口。 This StackOverflow answer建议使用 UI 自动化,而不是使用 WPF 进行旧的 API 调用。

如果您正在编写要搜索的应用程序,@TLama 建议的互斥替代方案非常有用。如果您尝试查找并关闭其他供应商的应用程序,那就没那么容易了。另外CheckForMutexes不返回窗口句柄,因此如何关闭窗口并不简单。

关于wpf - 如何知道要在 FindWindowByClassName InnoSetup 函数中使用的 WPF 应用程序的类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15806028/

51 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com