2017-01-26 8 views
-1

Ich versuche zu überprüfen, ob javaw.exe Fokus hat, führen Sie dann bestimmten Code aus, wenn es tut.Wie überprüfe ich, ob ein bestimmter Prozess den Fokus hat?

Früher hatte ich Code, der nach der Prozess-ID von javaw.exe suchen würde, dann vergleichen Sie es mit dem Prozess, der derzeit Fokus hatte, der für eine Weile arbeitete, aber dann bemerkte ich, wenn ich mehr als einen javaw.exe-Prozess hatte läuft, würde es nur auf einem dieser Prozesse funktionieren, während ich es brauche, wenn jeder javaw.exe-Prozess den Fokus hat.

Gibt es eine Möglichkeit, dies zu tun?

+1

'System.Diagnostics.Process.GetCurrentProcess()' –

+1

Whoops. Du hast Recht. Sie benötigen die Win32-API-Funktion "GetForgroundWindow" (die ein Fensterhandle zurückgibt), dann durchlaufen Sie die aktuell ausgeführten Prozesse, prüfen jeweils auf den Prozessnamen javaw.exe und vergleichen das Hauptfensterhandle mit dem Vordergrundfensterhandle. –

+0

http://stackoverflow.com/questions/884256/how-to-determine-if-an-process-is-the-current-ly-active-foreground-application –

Antwort

1

Das können Sie ganz einfach mit den WinAPI-Funktionen GetForegroundWindow() und GetWindowThreadProcessId() ermitteln.

Rufen Sie zuerst GetForegroundWindow an, um das Fensterhandle des aktuell fokussierten Fensters abzurufen, und rufen Sie dann GetWindowThreadProcessId auf, um die Prozess-ID dieses Fensters abzurufen. bekommen es schließlich als Process class Instanz von Process.GetProcessById()

Aufruf
Public NotInheritable Class ProcessHelper 
    Private Sub New() 'Make no instances of this class. 
    End Sub 

    <DllImport("user32.dll", SetLastError:=True)> _ 
    Private Shared Function GetForegroundWindow() As IntPtr 
    End Function 

    <DllImport("user32.dll", SetLastError:=True)> _ 
    Private Shared Function GetWindowThreadProcessId(ByVal hWnd As IntPtr, ByRef lpdwProcessId As UInteger) As Integer 
    End Function 

    Public Shared Function GetActiveProcess() As Process 
     Dim FocusedWindow As IntPtr = GetForegroundWindow() 
     If FocusedWindow = IntPtr.Zero Then Return Nothing 

     Dim FocusedWindowProcessId As UInteger = 0 
     GetWindowThreadProcessId(FocusedWindow, FocusedWindowProcessId) 

     If FocusedWindowProcessId = 0 Then Return Nothing 
     Return Process.GetProcessById(CType(FocusedWindowProcessId, Integer)) 
    End Function 
End Class 

Anwendungsbeispiel:

Dim ActiveProcess As Process = ProcessHelper.GetActiveProcess() 

If ActiveProcess IsNot Nothing AndAlso _ 
    String.Equals(ActiveProcess.ProcessName, "javaw", StringComparison.OrdinalIgnoreCase) Then 
    MessageBox.Show("A 'javaw.exe' process has focus!") 
End If 

hoffe, das hilft!

Verwandte Themen