0

CBT Windows Hookを使用して、ウィンドウの作成/削除/最小-最大/移動サイズ イベントを検出します。

私はうまく機能しますが、通常のウィジェットからのイベントをフィルタリングする必要があります。実際には、ユーザーがウィンドウと見なすウィンドウについてのみ、CBT フックによって通知される必要があります。

次のようにウィンドウをフィルタリングしても、スプリアスなイベントが継続的に発生するため、私が直面している問題は私を怒らせます。

BOOL FilterWindowHandle(HWND hwnd)
{
    // Filtered window having WS_CHILDWINDOW style
    if ((GetWindowLongPtr(hwnd, GWL_STYLE) & WS_CHILDWINDOW) != 0)
        return (TRUE);
    // Filtered window not having WS_CAPTION style
    if ((GetWindowLongPtr(hwnd, GWL_STYLE) & WS_CAPTION) == 0)
        return (TRUE);
    // Not filtered
    return (FALSE);
}

これらの偽のイベントは、影の効果、メニュー、および画面に表示されるすべてのものから発生します。

その子から実際のウィンドウをフィルタリングする堅牢な方法はありますか?

一部のアプリケーションは境界線なしでメインウィンドウを作成できるため、または同様のテストを避けWS_BORDERます...または間違っていますか?

4

2 に答える 2

1

「ユーザーがウィンドウと見なすもの」に適しているのは、Alt-Tab リスト (またはタスクバー) に表示される一連のウィンドウです。

この OldNewThing の記事では、ルールについて説明しています (ただし、ルールは修正されていないか、同じままであることが保証されているわけではありません)。

一般的なルールは次のとおりです。

表示されているウィンドウごとに、ルート オーナーが見つかるまでオーナー チェーンをたどっていきます。次に、表示されているウィンドウが見つかるまで、表示されている最後のアクティブなポップアップ チェーンに戻ります。開始した場所に戻ったら、ウィンドウを Alt+Tab リストに入れます。

これは、明示的なウィンドウ スタイルでオーバーライドできます。

WS_EX_TOOLWINDOW 拡張スタイルのウィンドウは、表示されていても表示されていないかのように扱われます。WS_EX_APPWINDOW 拡張スタイルのウィンドウは、所有者がいる場合でも所有者がいないかのように扱われます。

詳細については、これら 2 つの引用元の OldNewThing の完全な投稿を参照してください。

于 2010-12-25T22:59:28.613 に答える
0

私が過去に使用した有用な基準は、ウィンドウがトップレベル ウィンドウであるかどうか、つまりその親が NULL であるかどうかをテストすることです。

于 2010-12-25T22:07:16.273 に答える