代码之家  ›  专栏  ›  技术社区  ›  Doug Ferguson

使用Win32 API验证HWND

  •  16
  • Doug Ferguson  · 技术社区  · 14 年前

    7 回复  |  直到 14 年前
        1
  •  34
  •   Brian R. Bondy    14 年前

    IsWindow .

    尽管使用它的原因有二:

    1. 窗口句柄可以在窗口被销毁后重新使用,因此您不知道是否有完全不同的窗口句柄。

    线程不应将IsWindow用于 它没有创建的窗口,因为 此函数被调用。进一步的 手柄甚至可以指向一个

    可以做些什么?

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

    您还可以创建一个windows钩子来检测某些消息何时出现,但对于大多数需求来说,这可能是过分的。

        2
  •  15
  •   Yap Dog    12 年前

    这个问题很老了,但我自己也需要这个功能,在阅读了有关注意事项后,我有点失望。然而,在做了更多的挖掘之后,似乎一切都很好。除非您处理的是16位程序,否则IsWindow似乎是一个不错的选择。手柄重复使用问题似乎已根据以下内容得到充分解决:

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

    因此,由于上面的16位重用计数器,您不太可能遇到窗口重用问题。

        3
  •  8
  •   TWA    14 年前

    你可以用 IsWindow() 或者也尝试向窗口发送WM_NULL消息 SendMessage (hWnd,WM_NULL)并查看是否成功。

    我所知道的唯一解决方案是创建一个系统范围的 hook 它查找指示窗口被破坏的消息(WM_CLOSE,WM_DESTROY)。然后将消息窗口句柄与您持有的窗口句柄进行比较,以查看您关心的窗口是否受到影响。 See here for more information on system wide hooks.

        4
  •  4
  •   IdontCareAboutReputationPoints    7 年前

    也许是两者的结合 IsWindow FindWindow GetWindowThreadProcessId 会更准确

    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
        }
    }
    
        5
  •  1
  •   Chip Camden    11 年前

    如果所讨论的窗口的窗口过程在您的控制之下(或者如果您可以将其子类化),那么我建议注册一条自定义消息,该窗口将以非零结果响应该消息。将该消息发送到任何其他窗口(或无效HWND)将导致0。

    当然,这只会告诉您HWND是否引用了您控制的某个窗口——但如果给出上面的其他答案,这可能会更有利。

        6
  •  -1
  •   slfan Nematillo Ochilov    8 年前
    if(IsWindow(FindWindow(NULL , TEXT("Example Window Name")))){
         // do stuff
     }