Détecter une icône de la barre des tâches qui clignote

Je veux créer un script qui détecte quand l’icône de la barre des tâches clignote et active un programme. Je voudrais utiliser AutoIt ou l’API Windows.

Comment détecter quand l’icône de la barre des tâches d’un programme commence à clignoter?

Pour répondre directement à votre question, il n’existe pas de moyen facile (documenté et fiable) de détecter le clignotement de la fenêtre . Cela se produit à la suite de FlashWindow / FlashWindowEx . Une option très intrusive et lourde consiste à effectuer un accrochage global des deux API. Vous pouvez le faire en injectant une DLL à chaque application usermode et en effectuant un hook / détour local qui notifie un exécutable central que vous possédez.

Cependant, il y a un problème sous-jacent plus important avec ce que vous proposez, ce qui le rend extrêmement indésirable. Imaginez une application qui clignote constamment quand elle n’a pas le focus. Votre application le placerait au premier plan. Que se passerait-il s’il y avait deux de ces applications ?


Utiliser un hook WH_SHELL comme le suggère Raymond n’est pas trop difficile et se fait en appelant SetWindowsHookEx comme suit :

 SetWindowsHookEx(WH_SHELL, hook_proc, NULL, dwPID); 

Cela définit un hook de shell avec HOOKPROC comme hook_proc et dwPID est le thread avec lequel nous voulons associer le hook. Puisque vous mentionnez que vous savez déjà quel programme vous voulez cibler, je suppose que vous avez déjà un HWND dans cette fenêtre. Vous devez générer le dwPID , ce qui peut être fait comme dwPID :

 DWORD dwID = GetWindowThreadProcessId(hwnd, NULL) 

Cela remplira dwPID avec le PID associé du HWND . Pour la prochaine étape, je suppose que la procédure de hook est dans l’exécutable actuel, par opposition à une DLL. La procédure de hook pourrait être quelque chose comme ceci:

 LRESULT CALLBACK hook_proc(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode == HSHELL_REDRAW && lParam){ SetForegroundWindow(hwnd); // assumed hwnd is a global } return CallNextHookEx(NULL, nCode, wParam, lParam); } 

Le code ci-dessus n’a pas été testé et peut contenir des erreurs, mais il doit vous donner une idée générale de ce qu’il faut faire.

Une chose importante à noter avec les hooks de fenêtre est que SetWindowHookEx doit être appelé depuis un programme avec le même bitiness que la cible. Par exemple, si votre cible est 64 bits, l’appelant de SetWindowHookEx doit également être 64 bits. De plus, une fois que vous avez terminé, vous devriez nettoyer en supprimant votre hook avec UnhookWindowsHookEx .

Utilisez l’API RegisterShellHookWindow et écoutez les messages HSHELL_FLASH.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms644989(v=vs.85).aspx