应用程序检索窗口使用Enum *例程处理。
当应用程序管理枚举/创建窗口的句柄(获取类名,窗口统计信息......)时,句柄不再有效。使用try / catch块保护代码管理窗口句柄,但存储窗口句柄并连续用于管理表示的窗口。
如何处理窗口句柄的生命周期?有可能检测到手柄无效吗?
每次应用程序使用窗口句柄时,我都想避免使用try / catch块。
答案 0 :(得分:2)
窗口句柄只有在创建窗口的线程中使用时才是安全的。从任何其他线程,您可以了解窗口句柄,它在过去的某个时间是有效的。现在,它可能会也可能不会,如果是,它可能指的是一个完全不同的窗口。
答案 1 :(得分:2)
我已经有了实际的解决方案......但直到现在我才知道这个!
感谢大家澄清了窗口句柄的生命周期,但实际上有一种方法可以检测窗口句柄的生命周期:CbtProc。
如果系统安装了挂钩,则可以通知特定应用程序(它完全依赖于CBT挂钩的实际实现)关于窗口销毁,这表明特定句柄在之后无效。通知。
来自文档:
HCBT_DESTROYWND指定要销毁的窗口的句柄。
当然,使用WINAPI例程访问句柄必须与通知系统同步,这似乎没有提供良好的可行性(CBT钩子实际上阻止窗口销毁,因为它与应用程序逻辑同步)。
答案 2 :(得分:1)
您可以将其传递给IsWindow()
进行验证
有几点需要注意,但两者都适用于任何方法:
线程不应该使用IsWindow 它没有创建的窗口,因为 之后窗户可能会被摧毁 这个功能被调用了。进一步, 因为窗户把手是回收的 手柄甚至可以指向一个 不同的窗口。
如果您在自己的外部应用程序中对某个窗口执行此操作,则可以通过Set / GetProp()添加第二层验证,使用某种唯一标识符。
答案 3 :(得分:0)
您可以使用GetWindowInfo
功能。如果句柄无效,则返回0.