从使用 C++ 的本机 Win32 API 中,有没有办法确定与 HWND 关联的窗口是否仍然有效?

有帮助吗?

解决方案

您可以使用 Win32 API 是窗口.

不推荐 使用它有两个原因:

  1. 一旦窗口被销毁,窗口句柄就可以重新使用,因此您不知道是否拥有完全不同窗口的句柄。
  2. 状态可能会在这次调用后直接改变,你会认为它是有效的,但它可能真的无效。

来自 MSDN(与上面相同的链接):

线程不应将Iswindow用于未创建的窗口,因为在调用此功能后可能会破坏窗口。此外,由于窗口手柄被回收,手柄甚至可以指向其他窗口。

可以做什么?

也许您的问题可以重新架构,这样您就不需要检查有效的句柄。例如,也许您可​​以建立从客户端到服务器的管道。

您还可以创建一个 Windows 挂钩来检测某些消息何时发生,但这对于大多数需求来说可能有点过分了。

其他提示

这个问题是老了,但我需要这个功能我自己,是阅读有关注意事项后有点失望。但是,做了一些更挖掘后,似乎一切都很好。除非你正在处理的16位程序,IsWindow似乎是要走的路。手柄再利用的问题似乎已得到充分的处理根据这样的:

http://blogs.msdn.com/b/oldnewthing/archive /2007/07/17/3903614.aspx

所以,因为上16位计数器重复使用的,它是极不可能的,你会碰到一个窗口再利用问题。

可以使用 IsWindow()或者也尝试发送窗口WM_NULL消息 SendMessage消息(HWND,WM_NULL),看看它是否是成功的。

此外,这是事实,窗口随时可能被破坏,如果它不是你的控制之下。正如其他人所指出的手柄可能属于另一个窗口的句柄被重用。在现实中,我不知道该怎么可能是。

,我知道的唯一的解决办法,以宽创建系统看起来用于指示窗口消息被破坏(WM_CLOSE,WM_DESTROY)。这样,你会在消息窗口句柄比较你拿着,看看是否有你所关心的窗户约受到影响的。 参阅此处系统范围内的钩子的更多信息。

如果有问题的窗口的窗口过程是你的控制之下(或者,如果你能继承它),那么我会建议注册自定义消息窗口响应与非零结果。发送该消息到任何其他窗口(或无效的HWND)将导致0。

当然,如果HWND指的是窗户,你控制一个只告诉你 - 但也许给出其他答案上面甚至可能是有益的。

使用RegisterWindowMessage注册消息时,使用足够唯一的名称。

也许IsWindowFindWindowGetWindowThreadProcessId的组合将会更准确

HWND windowHandle = FindWindow(NULL, TEXT("window_title"));
LPDWORD oldpid = 0;
GetWindowThreadProcessId(windowHandle, &oldpid);
//after some time
if (IsWindow(windowHandle))
{
    LPDWORD newpid = 0;
    GetWindowThreadProcessId(windowHandle, &newpid);
    if (newpid == oldpid)
    {
        //the window is still running
    }else
    {
        //the window exists but has changed
    }
}
if(IsWindow(FindWindow(NULL , TEXT("Example Window Name")))){
     // do stuff
 }

将检查是否存在窗口,并且具有适当的名称

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top