2013-06-06 22 views
6

は、WS_CHILDビットをチェックすることです:HWNDがトップレベルのウィンドウを表すかどうかを判断する最も良い方法は何ですか?

LONG style = GetWindowLong(hwnd, GWL_STYLE); 
    int isTopLevel = !(style & WS_CHILD); 

か良い方法はありますか?

:ストレートCは、既存のWindows APIコードのみを呼び出します。

+0

がへの道でありますそれを行う - 子供でないウィンドウはトップレベルのウィンドウです。 –

+0

@ジョナサン - ただし、WS_CHILD(DesktopWindowの子)でトップレベルです。 – kero

+0

すべてのウィンドウはウィンドウ階層のデスクトップの子ですが、実際にはWS_CHILDが設定されているものだけが子ウィンドウです。 –

答えて

6
  • ウェイ#1:テストhWnd==GetAncestor(hWnd,GA_ROOT)

  • ウェイ#2: `WS_CHILD`スタイルの不在のチェック使用IsTopLevelWindow(文書化されていないUSER32 Win7の、)

1

GetParent() APIは、現在のウィンドウの親または所有者を返します。

+1

私がリンクしているドキュメントの最初の行に「指定されたウィンドウの親または所有者へのハンドルを取得します。記事の後半でオーナーウィンドウを取得する方法について説明します。 – jwismar

+0

@chris:ドキュメントが言う: "ウィンドウが子ウィンドウの場合、戻り値は親ウィンドウのハンドルです。ウィンドウがWS_POPUPスタイルのトップレベルウィンドウである場合、戻り値はオーナーウィンドウ。 –

+0

@jwismar、私は今日は盲目です。私は 'GetWindow'と' GetAncestor'に関するすべてを読んで、何らかの形で最初の発言の段落を逃しました。 – chris

0

あなたの方法は可能です(ただし、重複した/ポップアップウィンドウであるかどうかを確認する方が良いと思います)。おそらく別の方法があります - それはすべてのトップレベルのウィンドウを列挙し、ウィンドウが結果に含まれているかどうかをチェックすることです。

関連する問題