返回

UIAutomation 卡住怎么解决?优雅触发初始化操作

windows

解决 UIAutomation 卡住问题:优雅触发初始化操作

背景

体验问题

在基于 Chromium 的应用程序中,当另一个线程加载带有大型 DLL 文件时,Widget::Show 函数会经常卡住。这会拖慢应用程序窗口的显示速度。

调试过程

尝试过的解决方案

  • 尝试在加载大型 DLL 之前调用 Widget::Show,但只有第一次调用 Show 函数不会被加载程序锁住。
  • 使用本机 Windows API 打开一个窗口,然后在加载 DLL 时调用 Widget::Show,这也可以解决问题。
  • 观察到加载一个 DLL 会获得一个锁,阻止其他线程加载 DLL 或启动新线程。

根源分析

怀疑 UIAutomation 设置了一个钩子,当某些消息到来时,UIAutomation 就会钩住它并执行一些初始化操作,比如 InitConnectionEvents,这些操作会被某些东西锁住。

解决方案

优雅触发 UIAutomation 初始化

目前尚不清楚如何优雅地触发 UIAutomation "init" 操作,但可以尝试以下方法:

  • 探索使用 SetWindowsHookEx 设置一个键盘钩子,当按下特定组合键时触发 UIAutomation 初始化。
  • 使用 CreateThread 启动一个新线程,然后让该线程加载 DLL 并初始化 UIAutomation。
  • 调查是否可以通过调用某些 UIAutomation API 或函数手动触发初始化。

进一步调试

可以使用以下方法进一步调试问题:

  • 使用调试器(如 Visual Studio)设置断点,在 UIAutomation 钩子被调用时触发。
  • 使用 DebugView 等工具监控系统消息并查看在加载 DLL 时是否出现任何相关消息。
  • 查看 UIAutomation 源代码或文档以了解初始化过程的更多信息。

结论

解决 UIAutomation 卡住问题涉及调查 UIAutomation 初始化过程,并找到一种优雅地触发初始化操作的方法。通过尝试不同的解决方案和进一步调试,可以解决此问题并提高应用程序的性能。

常见问题解答

1. 为什么加载 DLL 会导致 UIAutomation 卡住?

加载 DLL 会获得一个锁,阻止其他线程加载 DLL 或启动新线程。这可能会影响 UIAutomation 初始化,因为 UIAutomation 可能依赖于其他 DLL 或新线程。

2. 如何优雅地触发 UIAutomation 初始化?

使用 SetWindowsHookEx 设置一个键盘钩子,当按下特定组合键时触发 UIAutomation 初始化。

3. 如何进一步调试 UIAutomation 卡住问题?

可以使用调试器设置断点,监控系统消息,并查看 UIAutomation 源代码或文档以了解有关初始化过程的更多信息。

4. 是否有其他可能的解决方案?

使用本机 Windows API 打开一个窗口,然后在加载 DLL 时调用 Widget::Show

5. 为什么尝试在加载 DLL 之前调用 Widget::Show 只能解决第一次调用?

加载程序锁只会影响第一次调用 Show 函数,因为在加载 DLL 后,加载程序锁已被释放。