2009-12-21 9 views
2

Je travaille sur une barre des tâches pour les moniteurs secondaires. Je l'ai assez bien travaillé. J'ai aussi l'apparence du flou aérodynamique. Mais ma question n'est probablement pas liée à la substance aéro.Fenêtre active Recherche

Ce que je veux faire est d'avoir toujours ma fenêtre de barre des tâches active/concentrée. Il n'a pas besoin d'être réellement concentré ou activé, je veux juste que ça ressemble à ça. Vous pouvez voir l'effet que je suis après en mettant juste un appel de setforgroundwindow dans l'application inactive. Mais je ne peux pas l'utiliser car je ne veux pas vraiment l'attraper comme ça. Je veux juste qu'il regarde toujours comme il le fait quand il a le focus.

J'ai essayé toutes sortes d'appels WM_XXX, à la fois pour piéger et envoyer, j'ai essayé les appels de setwindowpos, et ainsi de suite. La seule chose qui a fonctionné est l'appel de Mouse_Event (MOUSEEVENTF_LEFTDOWN et puis Mouse_Event (MOUSEEVENTF_LEFTUP) Je n'aime pas cette solution car c'est une bidouille/bidouille vraiment ringard à ce que je veux faire. Je dois faire passer que sans cliquer réellement sur mon application ou l'envoyer mouse_event appels.

+0

Votre application * * regard comme une barre des tâches? Je demande parce que la "vraie" barre des tâches n'a pas de look focus/unfocus - il n'y a pas de frame non-client pour changer de couleur. Je suppose que je ne comprends pas ce que les versets "concentrés" recherchent une barre des tâches. –

+0

Oui, il ressemble à la barre des tâches win7 quand il est en mode "aero". En raison de la façon dont j'ai dû implémenter le code blurbehind, lorsque vous avez cliqué sur ma barre des tâches, il semblait actif. Cliquez dessus et il a semblé désactivé. La réponse ci-dessous m'a aidé à le résoudre. –

+0

Je pense que vous pourriez être en mesure de voir la capture d'écran ici: http://www.facebook.com/photo.php?pid=106932&l=8cf7240918&id=100000261298303 –

Répondre

3

vous ne dites pas quelle langue vous travaillez ou si ce code est géré ou non géré.

pour C++ code non managé , il vous suffit de gérer le message WM_NCACTIVATE et de le forcer à toujours sembler actif, comme ceci:

case WM_NCACTIVATE: 
    { 
    // wParam tells us whether we are active or inactive, but we are going to ignore 
    // that and always pass active down to DefWindowProc so it will draw us active. 
    DefWindowProc(hwnd, uMsg, TRUE, lParam); 
    //return FALSE; // returning false here prevents actual deactivation 
    return TRUE; // return true allows deactivation (even though we draw as active) 
    } 
    break; 

modifier: la solution dans le code delphi (déplacé de commentaires pour le rendre plus lisible)

procedure TForm1.WndProc(var Message: TMessage); 
begin inherited; 
    if (Message.Msg = WM_NCACTIVATE) then 
    begin 
    DefWindowProc(handle, Message.Msg, 1, Message.LParam); 
    Message.Result := 1; 
    end; 
end; 
+0

MERCI. J'ai passé des heures à essayer de résoudre ça. Je savais que ce serait probablement quelque chose de simple comme une interception de msg, mais je tournais en rond. C'est du code Delphi. La clé était la partie DefWindowProc. Voici le code fixe: procédure TForm1.WndProc (var Message: TMessage); commencer hérité; if (Message.Msg = WM_NCACTIVATE), puis begin DefWindowProc (handle, Message.Msg, 1, Message.LParam); Message.Résultat: = 1; fin; fin; –

+0

Ouais, vous ne voulez vraiment pas entrer dans le buisiness de dessiner votre propre zone non-client. –