2010-02-02 5 views
16

Je cherche à créer une application C# qui change le contenu en fonction de l'application en cours. Donc, si l'utilisateur utilise Firefox, mon application le saurait. Idem pour Chrome, Visual Studio, TweetDeck, etc.C#: Détecter quelle application a le focus

Est-ce possible, et si oui, comment pourrais-je y parvenir?

J'ai un sentiment que je demande beaucoup - mais ça vaut le coup d'essayer.

Merci beaucoup à l'avance.

+0

Utilisez les interfaces d'accessibilité. C'est exactement le genre de chose pour laquelle ils sont destinés. –

+0

La réponse acceptée à cette question se développe sur le commentaire @ RaymondChen: http://stackoverflow.com/questions/11711400/how-to-monitor-focus-changes – John

Répondre

7

Jetez un coup d'œil à Application.AddMessageFilter, et recherchez les messages WM_ACTIVATEAPP, qui vous indiqueront quand une application est activée, c'est-à-dire qu'elle reçoit le focus.

+6

'Application.AddMessageFilter' n'intercepte que les messages pour le processus en cours, pas les autres processus. – larsmoa

4

Grrr. Comme c'est souvent le cas, j'ai passé quelques temps à googler avant de poster cette question. Une fois que j'ai finalement posté la question, ma recherche Google suivante a révélé la réponse.

Je n'ai pas encore testé, mais il semble que GetForegroundWindow() est la clé.

Plutôt que de me réécrire ce qui est déjà écrit, voici un lien vers la page qui a fourni les informations:

http://www.csharphelp.com/2006/08/get-current-window-handle-and-caption-with-windows-api-in-c/

appologies pour le temps de tous ceux que j'ai perdu en demandant une réponse Googalable (?).

+1

AddMessageFilter a l'avantage d'être du code purement géré, GetForegroundWindows est moins "lourd" "(vous vérifiez les fenêtres de premier plan quand vous avez besoin, au lieu d'être notifié pour chaque changement d'application) mais nécessite PInvoke. Vous n'avez qu'à choisir maintenant;) – munissor

7

Ceci peut être fait en .NET pur en utilisant le Automation framework qui fait partie du WPF. Ajouter des références à UIAutomationClient et UIAutomationTypes et utiliser Automation.AddAutomationFocusChangedEventHandler, .: par exemple

public class FocusMonitor 
{ 
    public FocusMonitor() 
    { 
     AutomationFocusChangedEventHandler focusHandler = OnFocusChanged; 
     Automation.AddAutomationFocusChangedEventHandler(focusHandler); 
    } 

    private void OnFocusChanged(object sender, AutomationFocusChangedEventArgs e) 
    { 
     AutomationElement focusedElement = sender as AutomationElement; 
     if (focusedElement != null) 
     { 
      int processId = focusedElement.Current.ProcessId; 
      using (Process process = Process.GetProcessById(processId)) 
      { 
       Debug.WriteLine(process.ProcessName); 
      } 
     } 
    } 
} 
Questions connexes