2010-02-03 174 views
1

我试图找到一个对话框,只要它打开它的句柄。FindWindowEx无法找到窗口句柄

现在只要打开对话框,我尝试在单独的线程中为该对话框调用FindWindowEx,但它返回NULL。

然后在调用FindWindowEx之前先进行一些睡眠。它在睡觉后有一段时间有效。

即使在创建对话框之前,它看起来像是FindWindowEx,并且睡眠有助于创建对话框,因此它有时会工作。

现在我已经把一些随机值放在睡眠中。而且它看起来不是一个好方法,因为它随时都可能失败。

是否有任何完整的证明方法,以便每次通过FindWindowEx都可以处理,而无需让线程进入睡眠状态。

+1

如何通知后台线程调用FindWindowEx - 可能它是两个线程之间的竞态条件? – Ruddy 2010-02-03 18:53:46

+0

是的 - 你应该让我们知道你的意思是“一旦它打开”。看起来你在实际创建对话框之前调用了'FindWindowEx()',因此可能有更好的方式来指示何时查找对话框,而不是现在正在使用的对话框。 – 2010-02-03 19:03:46

回答

1

一个非常简单的解决方案是在循环中重复调用FindWindowEx

HWND h = NULL; 
while (1) { 
     h = FindWindowEx(...); 
     if (h) { 
     break; 
     } 
     Sleep(100); 
    } 

这不是防弹的 - 这是一个无限循环,如果对话框讷韦尔打开或关闭太快(尽管这不太可能)。为了捕获这两种情况,让主线程(创建并运行对话框)维护一个简单的布尔属性,工作线程会查询是否仍然存在对话框。

+0

如果downvotwer告诉我为什么他认为这是一个不好的答案,那将是非常好的。这很简单,并且可以解决这个问题,而不会挂钩(当然,OP说他不想睡觉,但我认为他意味着他提到的单一随机睡眠电话)。 – 2010-02-04 10:36:41

2

如果你正在寻找的对话框是你的对话框 - 也就是说,你控制了代码 - 那么你可以从对话框中发送一条消息给你的观看应用程序,上面写着“哦,你好!

如果对话框不是你的,并且你不想旋转,你可以在WM_CREATE消息上使用create a Windows hook