문제

From the native Win32 API using C++ is there a way to determine whether the window associated with an HWND is still valid?

도움이 되었습니까?

해결책

You could use the Win32 API IsWindow.

It is not recommended to use it though for 2 reasons:

  1. Windows handles can be re-used once the window is destroyed, so you don't know if you have a handle to an entirely different window or not.
  2. The state could change directly after this call and you will think it is valid, but it may really not be valid.

From MSDN (same link as above):

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.

What can be done?

Perhaps your problem can be re-architected so that you do not have the need to check for a valid handle. Maybe for example you can establish a pipe from the client to the server.

You could also create a windows hook to detect when certain messages occur, but this is probably overkill for most needs.

다른 팁

SharePoint는 SharePoint 그룹을 사용 하여이 작업을 수행 할 수있는 상자 방식을 제공하지 않습니다.

Active Directory 구조를 모르지만 이미 정의 된 그룹과 일치하는 그룹이있을 가능성이 큽니다.그 그룹은 팀 사이트에 추가 될 수 있습니다.Active Directory에서 무언가가 변경된 경우 SharePoint의 사용 권한에 직접 반영됩니다.

Active Directory 그룹을 사용하는 유일한 단점은 회원이 SharePoint에 직접 표시되지 않는다는 것입니다.

자세한 내용은 Kirk Evans 블로그를 살펴보십시오.

SharePoint 보안 그룹에 대한 지침을 명확하게하는 Active Directory 도메인 서비스 그룹

You can use IsWindow() or also try to send the window a WM_NULL message with SendMessage(hWnd, WM_NULL) and see if it is successful.

Also, it is true that the window could be destroyed at any time if it isn't under your control. As others have stated the handle could potentially belong to another window as the handles are reused. In reality I don't know how likely that is.

The only solution that I know of the to create a system wide hook that looks for messages indicating a window is destroyed (WM_CLOSE, WM_DESTROY). Then you would compare the message window handle to ones you are holding to see if any of the windows you care about are affected. See here for more information on system wide hooks.

If the window procedure for the window in question is under your control (or if you can subclass it), then I would suggest registering a custom message that the window responds to with a non-zero result. Sending that message to any other window (or an invalid HWND) will result in 0.

Of course, that only tells you if the HWND refers to one of the windows that you control -- but perhaps given other answers above that might even be advantageous.

Use RegisterWindowMessage to register the message, using a sufficiently unique name.

Maybe a combination of IsWindow, FindWindow and GetWindowThreadProcessId will be more accurate

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
 }

will check if the window exists and has the appropriate name

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top