我使用FindWindowEx得到另外几个窗口的HWND,然后使用HWND获取一些信息。但是目前有个问题,就是使用HWND获取信息是在获取HWND之后的一段时间内进行的,窗口有可能关闭了,这样程序就出错了。我想知道怎样根据HWND来判断该窗口是否关闭。我不希望每次使用HWND获取信息都要重新使用FindWindowEx来进行,可以吗?

解决方案 »

  1.   

    用BOOL IsWindow(HWND hWnd);
      

  2.   

    A thread should not use IsWindow for a window that it did not create because the window could be destroyed after this function was called. Further, because window handles are recycled the handle could even point to a different window. 所以最好还是在使用时再用FindWindow,或者如果是有标题的窗口,用之前就用GetWindowText得到标题来判断是否为你要的窗口
      

  3.   

    ISWINDOW 可以判断 句柄 是否是窗口  也可以说 句柄当前是否还有效程序会出错?   
    用API 就算句柄失效  也只是返回0 操作没有成功  加个判断就可以了
      

  4.   


    这种情况发生的可能性有多大?如果概率很低的话,我就省点事就用IsWindow(HWND hWnd)了
      

  5.   

    理论上说有很多种方法。像fishion说的GetWindowText(),还有HDC GetWindowDC(
      HWND hWnd   // handle to window
    );BOOL GetWindowRect(          HWND hWnd,
        LPRECT lpRect
    );等等,不止这些。如果执行函数失败,马上用GetLastError()判断错误代码是不是等于ERROR_INVALID_WINDOW_HANDLE
    ,如果是就里窗口句柄无效了。
      

  6.   


    我的程序是获取句柄以后,然后得到个内存地址,对内存地址中存放的内容进行读取的,这样执行函数失败程序就出错了。而读内存这个步骤是长时间执行的,而如果我在每次读内存之前使用FindWindow的话,又有别的问题:我想要读取内存的窗口开了非常多个。如果检查的话挺麻烦的。
      

  7.   

    BOOL IsWindow(HWND hWnd);
    不过也不是很有效
      

  8.   

    BOOL IsWindow(HWND hWnd);
    不过也不是很有效
      

  9.   

    每次使用之前用iswindow判断。