2009-02-04 7 views

Répondre

10

Oui, c'est la seule façon dont je suis au courant.

Mais vous devez gérer le fait que GFW peut renvoyer NULL. Généralement, cela se produit lorsqu'un autre bureau (par exemple le bureau d'économiseur d'écran) est actif. Notez que l'utilisation d'un mot de passe d'économiseur peut affecter l'utilisation d'un autre bureau (cela dépend de la version de Windows et je ne me souviens pas des détails du fonctionnement des différentes versions).

Ce code ne fonctionnera pas correctement en mode débogage sous Visual Studio, car vous obtiendrez le handle de fenêtre de VS.

que tout autre que de :-) Peachy

1

Oui vous avez raison, sauf indication que vous voulez vérifier ActiveWindow de chaque fil.

1

Je suppose que vous voulez dire la fenêtre qui a le focus d'entrée quand vous dites "fenêtre active"?

Dans ce cas, oubliez l'API GetForegroundWindow(). Cela retournera la fenêtre la plus haute - pas toujours la fenêtre qui a le focus d'entrée.

Utilisez plutôt GetFocus().

+0

Cela est faux: « GetFocus retourne la fenêtre avec le focus du clavier pour le courant La file d'attente de messages du thread. [...] Utilisez la fonction GetForegroundWindow pour récupérer le handle de la fenêtre avec laquelle l'utilisateur travaille actuellement. " –

+0

Comme je l'ai dit: "si vous voulez dire la fenêtre qui a le focus d'entrée". – Stefan

+0

Oui, je veux dire la fenêtre dans laquelle l'utilisateur travaille. Merci –

1

Vous pouvez essayer d'utiliser le message WM_ACTIVATEAPP.
d'abord définir une variable bool bool wActive = false, dans la procédure WndProc, voici le prochain morceau de code:

case WM_ACTIVATEAPP: 
    wActive = (bool)wParam; 
return 0; 

Vous pouvez aller à MSDN pour trouver plus d'informations sur WM_ACTIVATEAPP

0

Oui, GetForgroundWindow() est un bon moyen de vérifier, se comporte correctement, même avec une fenêtre "Toujours sur le dessus" aka HWND_TOPMOST.

Une autre façon est avec GetActiveWindow()

HWND temp = GetActiveWindow(); 
    if (temp == hWnd) // Then your current window has focus 

Sinon les messages suivants signalent si l'accent a changé

case WM_KILLFOCUS: 
     // windowHasFocus = false 
    break; 

    case WM_SETFOCUS: 
     // windowHasFocus = true; 
    break; 
Questions connexes