如何在调用AutomationElement.FromHandle之前等待窗口准备就绪?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (117)

我有一个窗口钩子,它侦听正在创建的新窗口,并转发到执行一些自动化的.NET模块。

问题是几乎没有应用程序启动,AutomationElement.FromHandle(hwnd)被调用时,应用程序崩溃System.InvalidOperationException

Application: Ssms.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.InvalidOperationException
Stack:
   at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
   at MS.Win32.HwndWrapper.WndProc(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(System.Object)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)

我正在寻找一种方法,可以在窗口准备就绪时调用此函数,并且不会在目标应用程序中导致这些异常。

try{
        AutomationElement temp = AutomationElement.FromHandle(hwnd);
        LogMessage("Found Element from HWND " + hwnd.ToString("x") + "(" + hwnd + ")");
        return Pool.Add(temp, msg);
}
catch (System.Exception ex){
       LogMessage("Exception while element from HWND " + hwnd.ToString("x") + "(" + hwnd + ")");
}

有没有一种方法可以检测目标窗口是否准备好,然后调用我的函数?迄今为止我发现的唯一方法就是使用

Thread.Sleep(3000);

但是,在某些情况下,并不总能保证它可以工作并且等待时间可能太长。

提问于
用户回答回答于

你可以用

while (p.MainWindowHandle == IntPtr.Zero);

等到窗口准备好

扫码关注云+社区

领取腾讯云代金券