21 Stimmen

C#: Erkennen, welche Anwendung den Fokus hat

Ich bin auf der Suche nach einer C#-Anwendung zu erstellen, die den Inhalt ändert, je nachdem, welche Anwendung derzeit den Fokus hat. Wenn der Benutzer also Firefox verwendet, würde meine Anwendung das wissen. Dasselbe gilt für Chrome, Visual Studio, TweetDeck usw.

Ist dies möglich, und wenn ja, wie würde ich es erreichen?

Ich habe das Gefühl, ich verlange zu viel - aber einen Versuch ist es wert.

Vielen Dank im Voraus.

0 Stimmen

Verwenden Sie die Zugänglichkeitsschnittstellen. Das ist genau die Art von Dingen, für die sie gedacht sind.

0 Stimmen

Die akzeptierte Antwort auf diese Frage geht über den Kommentar von @RaymondChen hinaus: stackoverflow.com/questions/11711400/

13voto

larsmoa Punkte 12018

Dies kann in reinem .NET unter Verwendung der Automatisierungsrahmen die Teil der WPF ist. Hinzufügen von Referenzen zu UIAutomationClient y UIAutomationTypes und verwenden Automation.AddAutomationFocusChangedEventHandler , z.B.:

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);
            }
        }
    }
}

6voto

greggannicott Punkte 886

Grrr. Wie so oft, habe ich einige Zeit gegoogelt, bevor ich diese Frage gestellt habe.

Nachdem ich die Frage endlich gestellt hatte, ergab meine nächste Google-Suche die Antwort.

Ich habe es noch nicht getestet, aber es sieht so aus, als ob GetForegroundWindow() ist der Schlüssel.

Anstatt das bereits Geschriebene noch einmal zu wiederholen, hier ein Link zu der Seite, auf der die Informationen zu finden sind:

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

Ich bitte um Entschuldigung für die Zeit, die ich mit meiner Frage und einer googligen (?) Antwort verschwendet habe.

1 Stimmen

AddMessageFilter hat den Vorteil, rein verwalteter Code zu sein, GetForegroundWindows ist weniger "schwer" (man prüft die Vordergrundfenster, wenn man sie braucht, anstatt bei jeder Anwendungsänderung benachrichtigt zu werden), benötigt aber PInvoke. Sie müssen sich nur noch entscheiden ;)

5voto

Håvard S Punkte 22133

Werfen Sie einen Blick auf Application.AddMessageFilter und suchen Sie nach WM_ACTIVATEAPP-Meldungen, die Ihnen mitteilen, wann eine Anwendung aktiviert ist, d. h. den Fokus erhält.

8 Stimmen

Application.AddMessageFilter fängt nur Nachrichten für den aktuellen Prozess ab, nicht für andere Prozesse.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X