2017-01-26 6 views
-1

Я пытаюсь проверить, имеет ли javaw.exe фокус, а затем выполнить определенный код, если это произойдет.Как проверить, имеет ли определенный процесс фокус?

Раньше у меня был код, который будет искать идентификатор процесса javaw.exe, а затем сравните его с процессом, который в настоящее время имеет фокус, который работал некоторое время, но потом я заметил, когда у меня было более одного процесса javaw.exe он работает только на одном из этих процессов, в то время как мне нужно, чтобы он работал, когда какой-либо процесс javaw.exe имеет фокус.

Есть ли способ сделать это?

+1

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

+1

Упс. Ты прав. Вам понадобится функция API 'GetForgroundWindow' Win32 API (которая возвращает дескриптор окна), затем перебирает текущие запущенные процессы, проверяя каждый из них на имя процесса javaw.exe и сравнивая его с Главным окном для дескриптора окна переднего плана. –

+0

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

ответ

1

Это можно легко определить с помощью функций WinAPI GetForegroundWindow() и GetWindowThreadProcessId().

Первый вызов GetForegroundWindow, чтобы получить дескриптор окна текущего сфокусированного окна, затем вызовите GetWindowThreadProcessId, чтобы получить идентификатор процесса этого окна. Наконец получить его как Process class например, вызвав пример Process.GetProcessById()

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 

Использования:

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 

Надеется, что это помогает!

Смежные вопросы