2010-08-13 39 views
0

J'utilise CBT Windows Hook pour détecter les événements de création/suppression/min-max/déplacement de fenêtre.Détecter les fenêtres d'application

Je fonctionne bien, mais j'ai besoin de filtrer les événements provenant des widgets normaux. Pratiquement, j'ai besoin d'être notifié par CBT hook uniquement pour les fenêtres que l'utilisateur considère Windows.

Le problème que je suis face à moi faire enrager, depuis que je reçois continuellement des événements parasites, même si je filtre fenêtre comme suit:

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); 
} 

Ces événements parasites vient des effets d'ombre, les menus et tout affichés à l'écran .

Existe-t-il une méthode robuste pour filtrer les fenêtres réelles de ses enfants?

J'évite le test de WS_BORDER ou similaire, puisque certaines applications pourraient créer leur fenêtre principale sans bordure ... ou ai-je tort?

+0

vous êtes celui avec un certain nombre de critères. vous avez dans votre esprit une définition de ce qu'est une "vraie fenêtre", et c'est différent de ce que le système d'exploitation considère comme une fenêtre. Définissez ces critères et écrivez votre code pour le faire correspondre. Conseil: utilisez Spy ++ pour examiner les styles de fenêtres des fenêtres de votre système, et ceci, plus MSDN, devrait vous aider à trouver la solution. – tenfour

+0

@tenfour Plus facile à dire qu'à faire! ;) – Luca

+0

peut-être, mais de toute façon à la fin, vous devez savoir ce que vous faites, et ce que les styles signifient.Personne n'a dit que la programmation était facile :) – tenfour

Répondre

1

Un bon ajustement pour "ce que l'utilisateur considère comme Windows" est l'ensemble des fenêtres affichées dans la liste Alt-Tab (ou dans la barre des tâches).

Cet article OldNewThing explique les règles (bien que les règles ne sont pas fixes ou garantis restent les mêmes):

La règle générale est:

Pour chaque fenêtre visible, remonter sa chaîne de propriétaire jusqu'à ce que vous trouviez le propriétaire racine . Puis redescendez la dernière chaîne de pop-up active jusqu'à ce que vous trouviez une fenêtre visible. Si vous êtes de retour à où vous avez démarré, placez la fenêtre dans la liste Alt + Tab.

Cela peut être remplacé avec des styles de fenêtre explicites:

Une fenêtre avec le style étendu WS_EX_TOOLWINDOW est traitée comme si elle était pas visible, même si elle est. Une fenêtre avec le style étendu WS_EX_APPWINDOW est traitée comme si elle avait le propriétaire , même si c'est le cas.

Voir l'article complet OldNewThing dont ces deux citations proviennent pour plus de détails.

0

Un critère utile que j'ai utilisé dans le passé est de tester si la fenêtre est une fenêtre de niveau supérieur, c'est-à-dire que son parent est NULL.