web-dev-qa-db-fra.com

Comment puis-je dire si une fenêtre se concentre? (API Win32)

Utilisation de l'API Win32 (en C, mais c'est sans conséquence) Comment puis-je dire si une fenêtre donnée (identifiée par HWND) est-elle mise au point? J'accroche une application surveille un événement et lorsque cet événement se produit, je souhaite vérifier si l'application est déjà mise au point. Si ce n'est pas le cas, je veux clignoter la fenêtre jusqu'à ce qu'ils soient concentrés.

Alternativement, l'indicateur de struct FlashWindowex STRL a-t-il clignotant jusqu'à ce que la fenêtre soit mise au point de ne pas clignoter si la fenêtre est déjà mise au point? Je ne peux pas tester cela maintenant depuis que je ne suis pas dans mon environnement de développement, mais j'avais l'impression que cela clignoterait de toute façon, ce que j'essaie d'éviter.

Edit : Également, si cela compte, l'application utilise DirectX dans cette fenêtre.

23
Daniel Jennings

Outre les gkrogères répondant à GetactiveWindow, vous pouvez également conserver une variable booléenne pour la fenêtre que vous souhaitez savoir s'il a la mise au point ou non en piégeant le WM_SETFOCUS et WM_KILLFOCUS Événements, ou WM_ACTIVATE

WndProc() ..
case WM_SETFOCUS:
  puts( "Got the focus" ) ;
  break ;

case WM_KILLFOCUS:
  puts( "Lost the focus" ) ;
  break;

case WM_ACTIVATE:
  if( LOWORD(wparam) == WA_ACTIVE )
    puts( "MEGAZORD ACTIVATED kew kew kew (flashy-eyes)" ) ;
  else 
    puts( "I AM NOW INACTIVE." ) ;
  break ;
15
bobobobo

Voulez-vous vraiment dire "concentration" ou voulez-vous dire "actif?"

Une fenêtre a la focalisation - celle qui est d'abord en ligne pour obtenir des événements de clavier. La fenêtre extérieure (que l'utilisateur peut faire glisser autour de l'écran) est "actif" si l'un de ses sous-ondulations a l'accent, mais cela pourrait ou ne pas avoir la mise au point elle-même.

7
Jason Cohen

Utilisez la fonction GetForegroundwindow pour obtenir le HWND que vous vous concentrez actuellement. Ensuite, vous devez simplement le comparer à la fenêtre de votre application pour vérifier si elle contient la mise au point ou non.

4
user2133061

Pour plusieurs enfants sans refuge: dans l'enfant, vous pouvez enregistrer la mise au point, 13/08/19 VS2017. Vous pouvez enregistrer la mise au point afin que le parent sait quel enfant sans refuge a été cliqué sur.

Dans le gestionnaire de rappel des enfants:

case WM_CHILDACTIVATE: //only gets called when the child border is click on.
    //CurrentFocus = hDlg; //example : can save the focus globally for parent usage.
    //Beep(2000, 250); // so you can test
break;

case WM_GETMINMAXINFO: //gets called when child window is being moved or sized.
        //Beep(2000, 250);
break;

case WM_LBUTTONDOWN:  //Only called when cursor is inside the child client area
    //CurrentFocus = hDlg; // following the focus.
    //Beep(2000, 250);
break;
0
user11910606